package org.android.demo;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import javax.microedition.khronos.opengles.GL10;
import android.graphics.Bitmap;
import android.opengl.GLUtils;
/**
* @see 绘制用到的通用方法
* @author (虾米吃鱼肉干)
*
*/
public class MyUtil {
private final static float PI = (float) Math.PI;
public static float DEPTH = -3.0f;// 深度
public static int NUMBER = 40;// 网格数量Num*Num
int[] mTextures;// 纹理标识数组
float[] mBase = new float[3];// 原点偏移量
private static float dx;// 单位x坐标
private static float dy;// 单位y坐标
private static float tx;// 单位纹理坐标
private static float angle;// 单位角度
private float mVertexsArray[][][] = new float[NUMBER][NUMBER][3];// 顶点坐标数组
private float mTexCoordsArray[][][] = new float[NUMBER][NUMBER][2];// 纹理坐标数组
private float mNormalsArray[][][] = new float[NUMBER][NUMBER][3];// 法向量坐标数组
private short mOrderArray[] = new short[(NUMBER - 1) * (NUMBER - 1) * 4];// 绘制顺序数组
FloatBuffer mVertexBuffer;// 顶点
FloatBuffer mTexCoordsBuffer;// 纹理
FloatBuffer mNormalsBuffer;// 法向量
ShortBuffer mOrderBuffer;// 绘制顺序
int rot = 0;// 旋转角度
int k = 0;//
float d;// 深度中间缓存
/**
* @see 初始化顶点信息、纹理信息、顶点法向量信息、顶点顺序信息
*/
public MyUtil() {
super();
initInfo();
generationPoints();
getPointBuffer();
getTexCoordsBuffer();
getNormals();
getNormalsBuffer();
getOrder();
}
/**
* @see 设置网格密度 n*n
* @param n
*/
public void setNum(int n) {
NUMBER = n;
}
/**
* @see 设置坐标深度值
* @param d
*/
public void setDepth(float d) {
DEPTH = d;
}
/**
* @see 初始化单位值
*/
private void initInfo() {
// 5 3.35
dx = 3.0f / (NUMBER - 1);
dy = 2.0f / (NUMBER - 1);
tx = 1.0f / (NUMBER - 1);
angle = ((2 * PI) / (NUMBER - 1));
mBase[0] = 0;
mBase[1] = 0;
mBase[2] = DEPTH;
}
/**
* @see 生成顶点坐标与纹理坐标
*/
public void generationPoints() {
for (int i = 0; i < NUMBER; i++) {
d = getDepth(i);
for (int j = 0; j < NUMBER; j++) {
mVertexsArray[i][j][0] = i * dx - NUMBER * dx / 2;
mVertexsArray[i][j][1] = NUMBER * dy / 2 - j * dy;
mVertexsArray[i][j][2] = d;
mTexCoordsArray[i][j][0] = i * tx;
mTexCoordsArray[i][j][1] = (NUMBER - 1 - j) * tx;
}
}
}
/**
* @see 计算深度值根据正弦曲线规律
* @param i
* @return
*/
public float getDepth(int i) {
return (DEPTH + (float) Math.sin(2 * i * angle)) * 0.05f
* Math.abs(DEPTH);
}
/**
* @see 得到绘制顶点顺序buffer
*/
private void getOrder() {
for (int i = 0; i < NUMBER - 1; i++) {
for (int j = 0; j < NUMBER - 1; j++) {
mOrderArray[(i * (NUMBER - 1) + j) * 4 + 0] = (short) (i
* NUMBER + j);
mOrderArray[(i * (NUMBER - 1) + j) * 4 + 1] = (short) ((i + 1)
* NUMBER + j);
mOrderArray[(i * (NUMBER - 1) + j) * 4 + 2] = (short) (i
* NUMBER + j + 1);
mOrderArray[(i * (NUMBER - 1) + j) * 4 + 3] = (short) ((i + 1)
* NUMBER + j + 1);
}
}
mOrderBuffer = ShortBuffer.wrap(mOrderArray);
}
/**
* @see 得到顶点buffer
*/
private void getPointBuffer() {
float vertex[] = new float[NUMBER * NUMBER * 3];
for (int i = 0; i < NUMBER; i++) {
for (int j = 0; j < NUMBER; j++) {
for (int k = 0; k < 3; k++) {
vertex[(i * NUMBER + j) * 3 + k] = mVertexsArray[i][j][k];
}
}
}
mVertexBuffer = FloatBuffer.wrap(vertex);
}
/**
* @see 得到纹理buffer
*/
private void getTexCoordsBuffer() {
float texCoord[] = new float[NUMBER * NUMBER * 2];
for (int i = 0; i < NUMBER; i++) {
for (int j = 0; j < NUMBER; j++) {
for (int k = 0; k < 2; k++) {
texCoord[(i * NUMBER + (NUMBER - 1 - j)) * 2 + k] = mTexCoordsArray[i][j][k];
}
}
}
mTexCoordsBuffer = FloatBuffer.wrap(texCoord);
}
/**
* @see 1得到法向量buffer
*/
private void getNormalsBuffer() {
float normal[] = new float[NUMBER * NUMBER * 3];
for (int i = 0; i < NUMBER; i++) {
for (int j = 0; j < NUMBER; j++) {
for (int k = 0; k < 3; k++) {
normal[(i * NUMBER + j) * 3 + k] = mNormalsArray[i][j][k];
}
}
}
mNormalsBuffer = FloatBuffer.wrap(normal);
}
/**
* @see 2计算出顶点法向量坐标
*/
private void getNormals() {
float[] nor = new float[3];// 三个顶点
for (int i = 0; i < NUMBER; i++) {
nor = getVertexsNormal(i, 1);
for (int j = 0; j < NUMBER; j++) {
mNormalsArray[i][j][0] = nor[0];
mNormalsArray[i][j][1] = nor[1];
mNormalsArray[i][j][2] = nor[2];
}
}
}
/**
* @see 3计算顶点法向量
* @param i
* @param j
* @return
*/
private float[] getVertexsNormal(int i, int j) {
float[] nor1 = new float[3];
float[] nor2 = new float[3];
float[] nor3 = new float[3];
float[] nor4 = new float[3];
float[] temp = new float[] { 0, 0, -1.0f, };
if (i - 1 < 0 || j - 1 < 0) {
nor1 = temp;
} else {
nor1 = getNormalFrom3Vertexs(new float[] {
mVertexsArray[i][j - 1][0], mVertexsArray[i][j - 1][1],
mVertexsArray[i][j - 1][2] }, new float[] {
mVertexsArray[i - 1][j][0], mVertexsArray[i - 1][j][1],
mVertexsArray[i - 1][j][2] }, new float[] {
mVertexsArray[i][j][0], mVertexsArray[i][j][1],
mVertexsArray[i][j][2] });
}
if (j - 1 < 0 || i + 1 == NUMBER) {
nor2 = temp;
} else {
nor2 = getNormalFrom3Vertexs(new float[] {
mVertexsArray[i + 1][j][0], mVertexsArray[i + 1][j][1],
mVertexsArray[i + 1][j][2] }, new float[] {
mVertexsArray[i][j - 1][0], mVertexsArray[i][j - 1][1],
mVertexsArray[i][j - 1][2] }, new float[] {
mVertexsArray[i][j][0], mVertexsArray[i][j][1],
mVertexsArray[i][j][2] });
}
if (i - 1 < 0 || j + 1 == NUMBER) {
nor3 = temp;
} else {
nor3 = getNormalFrom3Vertexs(new float[] { mVertexsArray[i][j][0],
mVertexsArray[i][j][1], mVertexsArray[i][j][2] },
new float[] { mVertexsArray[i - 1][j][0],
mVertexsArray[i - 1][j][1],
mVertexsArray[i - 1][j][2] }, new float[] {
mVertexsArray[i][j + 1][0],
mVertexsArray[i][j + 1][1],
mVertexsArray[i][j + 1][2] });
}
if (i + 1 == NUMBER || j + 1 == NUMBER) {
nor4 = temp;
} else {
nor4 = getNormalFrom3Vertexs(new float[] {
mVertexsArray[i + 1][j][0], mVertexsArray[i + 1][j][1],
mVertexsArray[i + 1][j][2] }, new float[] {
mVertexsArray[i][j][0], mVertexsArray[i][j][1],
mVertexsArray[i][j][2] }, new float[] {
mVertexsArray[i][j + 1][0], mVertexsArray[i][j + 1][1],
mVertexsArray[i][j + 1][2] });
}
return getNormalFrom4Normals(nor1, nor2, nor3, nor4);
}
/**
* @see 4根据每个顶点相邻的4个三角形计算出该顶点的法向量
* @param nor1
* @param nor2
* @param nor3
* @param nor4
* @return
*/
private float[] getNormalFrom4Normals(float[] nor1, float[] nor2,
float[] nor3, float[] nor4) {
float nor[] = new float[3];
nor[0] = nor1[0] + nor2[0] + nor3[0] + nor4[0];
nor[1] = nor1[1] + nor2[1] + nor3[1] + nor4[1];
nor[2] = nor1[2] + nor2[2] + nor3[2] + nor4[2];
return unitNormal(nor);
}
/**
* @see 5通过三个顶点计算该三角形的平面法向量
* @param v1
* @param v2
* @param v3
*/
private float[] getNormalFrom3Vertexs(float[] v1, float[] v2, float[] v3) {
float a0 = 0, a1 = 0, a2 = 0, b0 = 0, b1 = 0, b2 = 0;
float nor[] = new float[3];
a0 = v2[0] - v1[0];
a1 = v2[1] - v1[1];
a2 = v2[2] - v1[2];
b0 = v3[0] - v2[0];
b1 = v3[1] - v2[1];
b2 = v3[2] - v2[2];
nor[0] = a1 * b
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Android opengl绘制飘动的国旗效果源码.zip (28个子文件)
Android opengl绘制飘动的国旗效果源码
1-1211191104570-L.png 28KB
Android opengl绘制飘动的国旗效果源码
MyFlagDemo
AndroidManifest.xml 633B
res
drawable-nodpi
icon5.jpg 5KB
b4.jpg 100KB
icon3.jpg 3KB
flag.png 7KB
layout
main.xml 382B
values
strings.xml 161B
src
org
android
demo
MyUtil.java 15KB
Main.java 2KB
Test.java 6KB
MyEnum.java 4KB
bin
org
android
demo
MyEnum.class 3KB
R.class 477B
Main.class 2KB
R$layout.class 388B
R$attr.class 334B
MyUtil.class 9KB
R$string.class 421B
R$drawable.class 478B
Test.class 5KB
classes.dex 17KB
resources.ap_ 118KB
MyFlagDemo.apk 127KB
.classpath 273B
assets
default.properties 450B
.project 813B
gen
org
android
demo
R.java 762B
共 28 条
- 1
资源评论
校歪歪
- 粉丝: 30
- 资源: 2468
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 自动驾驶定位系列教程十:闭环修正.pdf
- HM2333-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- Python实现插入排序算法(源代码)
- 123.cpp
- HM2319-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- modbus4j-3.0.4.jar
- 蒙特·卡罗实验、使用蒙特·卡罗方法计算圆周率近似值.docx
- HM2319A-VB一款P-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明
- JAVA SpringBoot 集成华为云OBS,多镜像配置settings
- 一个文件共享系统,包括前端文件展示系统和后台管理系统,基于SpringBoot + MyBatis实现
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功