package com.bn.Sample8_5;
import static com.bn.Sample8_5.ShaderUtil.createProgram;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import android.opengl.GLES30;
/*
* 正二十面体
* 基于三个互相垂直的黄金长方形
*/
public class Regular20
{
int mProgram;//自定义渲染管线着色器程序id
int muMVPMatrixHandle;//总变换矩阵引用
int maPositionHandle; //顶点位置属性引用
int maTexCoorHandle; //顶点纹理坐标属性引用
int muMMatrixHandle;
int maCameraHandle; //摄像机位置属性引用
int maNormalHandle; //顶点法向量属性引用
int maLightLocationHandle;//光源位置属性引用
String mVertexShader;//顶点着色器代码脚本
String mFragmentShader;//片元着色器代码脚本
FloatBuffer mVertexBuffer;//顶点坐标数据缓冲
FloatBuffer mTexCoorBuffer;//顶点纹理坐标数据缓冲
FloatBuffer mNormalBuffer;//顶点法向量数据缓冲
int vCount=0;
float xAngle=0;//绕x轴旋转的角度
float yAngle=0;//绕y轴旋转的角度
float zAngle=0;//绕z轴旋转的角度
float bHalf=0;//黄金长方形的宽
float r=0;//球的半径
public Regular20(MySurfaceView mv,float scale,float aHalf,int n)
{
//调用初始化顶点数据的initVertexData方法
initVertexData(scale,aHalf,n);
//调用初始化着色器的intShader方法
initShader(mv);
}
public void initVertexData(float scale, float aHalf, int n)
{//自定义的初始化顶点数据的方法
aHalf*=scale; //黄金长方形长边的一半
bHalf=aHalf*0.618034f; //黄金长方形短边的一半
r=(float) Math.sqrt(aHalf*aHalf+bHalf*bHalf);//几何球的半径
vCount=3*20*n*n;//顶点个数
ArrayList<Float> alVertix20=new ArrayList<Float>();//正二十面体的顶点列表
ArrayList<Integer> alFaceIndex20=new ArrayList<Integer>();//用于卷绕构成正二十面体各个三角形的顶点编号列表
initAlVertix20(alVertix20,aHalf,bHalf);//初始化正二十面体的顶点坐标数据
initAlFaceIndex20(alFaceIndex20);//初始化用于卷绕构成正二十面体各个三角形的顶点编号列表
//构成正二十面体的各个三角形顶点的坐标数据数组
float[] vertices20=VectorUtil.cullVertex(alVertix20, alFaceIndex20);
ArrayList<Float> alVertix=new ArrayList<Float>();//几何球原始顶点列表
ArrayList<Integer> alFaceIndex=new ArrayList<Integer>();//构成几何球的各三角形顶点编号列表
int vnCount=0;//顶点计数器
for(int k=0;k<vertices20.length;k+=9)//对正二十面体中的每个三角形循环
{
float [] v1=new float[]{vertices20[k+0], vertices20[k+1], vertices20[k+2]}; //当前三角形3个
float [] v2=new float[]{vertices20[k+3], vertices20[k+4], vertices20[k+5]};//顶点的坐标
float [] v3=new float[]{vertices20[k+6], vertices20[k+7], vertices20[k+8]};
for(int i=0;i<=n;i++)
{//根据切分的份数求出几何球原始顶点的坐标
float[] viStart=VectorUtil.devideBall(r, v1, v2, n, i);//对圆弧进行切分
float[] viEnd=VectorUtil.devideBall(r, v1, v3, n, i);//对圆弧进行切分
for(int j=0;j<=i;j++)
{
float[] vi=VectorUtil.devideBall(r, viStart, viEnd, i, j);//对圆弧进行切分
alVertix.add(vi[0]); alVertix.add(vi[1]); alVertix.add(vi[2]);//将坐标存入原始顶点列表
}
}
for(int i=0;i<n;i++)
{//循环生成构成几个球各个三角形的顶点编号列表
if(i==0){//若是第0行,顶点编号012
alFaceIndex.add(vnCount+0); alFaceIndex.add(vnCount+1);alFaceIndex.add(vnCount+2);
vnCount+=1;//顶点计数器加1
if(i==n-1){ //如果是正二十面体三角形的最后一次循环,将下一拨的顶点个数也加上
vnCount+=2;
}
continue;
}
int iStart=vnCount;//第i行开始的编号(这里的行指的是平面展开图中的行)
int viCount=i+1;//第i行顶点数
int iEnd=iStart+viCount-1;//第i行结束顶点编号
int iStartNext=iStart+viCount;//第i+1行开始的顶点编号
int viCountNext=viCount+1;//第i+1行顶点数
int iEndNext=iStartNext+viCountNext-1;//第i+1行结束的顶点编号
for(int j=0;j<viCount-1;j++)
{//前面的四边形
int index0=iStart+j;//四边形4个顶点的编号
int index1=index0+1;
int index2=iStartNext+j;
int index3=index2+1;
//将四边形4个顶点卷绕成两个三角形
alFaceIndex.add(index0); alFaceIndex.add(index2);alFaceIndex.add(index3);
alFaceIndex.add(index0); alFaceIndex.add(index3);alFaceIndex.add(index1);
}
//最后一个三角形3个顶点的编号
alFaceIndex.add(iEnd); alFaceIndex.add(iEndNext-1);alFaceIndex.add(iEndNext); //最后一个三角形
vnCount+=viCount;//第i行前所有顶点数的和
if(i==n-1){ //如果是正二十面体三角形的最后一次循环,将下一拨的顶点个数也加上
vnCount+=viCountNext;
}
}
}
//按照生成的顶点编号序列填充顶点坐标数据数组
float[] vertices=VectorUtil.cullVertex(alVertix, alFaceIndex);
float[] normals=vertices;//顶点坐标就是法向量
ArrayList<Float> alST20=new ArrayList<Float>();//正二十面体顶点的原始纹理坐标列表
ArrayList<Integer> alTexIndex20=new ArrayList<Integer>();//正二十面体纹理坐标编号列表
float sSpan=1/5.5f;//每个纹理三角形的边长
float tSpan=1/3.0f;//每个纹理三角形的高
//下面4个循环生成了正二十面体展开后各个顶点的纹理坐标
for(int i=0;i<5;i++){
alST20.add(sSpan+sSpan*i); alST20.add(0f);
}
for(int i=0;i<6;i++){
alST20.add(sSpan/2+sSpan*i); alST20.add(tSpan);
}
for(int i=0;i<6;i++){
alST20.add(sSpan*i); alST20.add(tSpan*2);
}
for(int i=0;i<5;i++){
alST20.add(sSpan/2+sSpan*i); alST20.add(tSpan*3);
}
initAlTexIndex20(alTexIndex20); //生成组成正二十面体各个三角形顶点的纹理坐标编号列表
//按照生成的顶点编号序列填充顶点纹理坐标数据数组(正二十面体的)
float[] st20=VectorUtil.cullTexCoor(alST20, alTexIndex20);
ArrayList<Float> alST=new ArrayList<Float>(); //几何球的原始纹理坐标列表(未卷绕)
for(int k=0;k<st20.length;k+=6)
{//对正二十面体的各个三角形进行循环
float [] st1=new float[]{st20[k+0], st20[k+1], 0};//取出当前三角形
float [] st2=new float[]{st20[k+2], st20[k+3], 0};//3个顶点的纹理坐标
float [] st3=new float[]{st20[k+4], st20[k+5], 0};
for(int i=0;i<=n;i++)
{//对正二十面体平面展开图的边进行切分
float[] stiStart=VectorUtil.devideLine(st1, st2, n, i);
float[] stiEnd=VectorUtil.devideLine(st1, st3, n, i);
for(int j=0;j<=i;j++)
{//计算几何球平面展开图顶点对应的纹理坐标
float[] sti=VectorUtil.devideLine(stiStart, stiEnd, i, j);
alST.add(sti[0]); alST.add(sti[1]);//将纹理坐标加入列表
}
}
}
//按照生成的顶点编号序列填充顶点纹理坐标数据数组(几何球的)
float[] textures=VectorUtil.cullTexCoor(alST, alFaceIndex);
//顶点坐标数据初始化
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);//创建顶点坐标数据缓冲
vbb.order(ByteOrder.nativeOrder());//设置字节顺序为本地操作系统顺序
mVertexBuffer = vbb.asFloatBuffer();//转换为float型缓冲
mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
mVertexBuffer.position(0);//设置缓冲区起始位置
//法向量数据初始化
ByteBuffer nbb = ByteBuffer.allocateDirect(normals.length*4);//创建顶点法向量数据缓冲
nbb.order(ByteOrder.nativeOrder());//设置字节顺序为本地操作系统顺序
mNormalBuffer = nbb.asFloatBuffer();//转换为float型缓冲
mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据
mNormalBuffer.position(0);//设置缓冲区起始位置
//st坐标数据初始化
ByteBuffer tbb = ByteBuffer.allocateDirect(textures.length*4);//创建顶点纹理数据缓冲
tbb.order(ByteOrder.nativeOrder());//设置字节顺序为本地操作系统顺序
mTexCoorBuffer = tbb.asFloatBuffer();//转换为float型缓冲
mTexCoorBuffer.put(textures);//向缓冲区中放入顶点纹理数据
mTexCoorBuffer.position(0);//设置缓冲区起始位置
}
public void initAlVertix20(ArrayList<Float> alVertix20,float aHalf,float bHalf){
alVertix20.add(0f); alVertix20.add(aHalf); alVertix20.add(-bHalf);//对应图8-17的1号点
alVertix20.add(0f); alVertix20.add(aHalf); alVertix20.add(bHalf);//对应图8-17的2号点
alVertix20.add(aH
没有合适的资源?快使用搜索试试~ 我知道了~
opengles3.0游戏开发(上
共2000个文件
class:1358个
java:778个
png:686个
需积分: 10 8 下载量 37 浏览量
2018-03-26
17:05:19
上传
评论 1
收藏 25.74MB RAR 举报
温馨提示
https://blog.csdn.net/likesyourhttps://blog.csdn.net/likesyourhttps://blog.csdn.net/likesyour
资源推荐
资源详情
资源评论
收起资源包目录
opengles3.0游戏开发(上 (2000个子文件)
resources.ap_ 605KB
resources.ap_ 587KB
resources.ap_ 369KB
resources.ap_ 353KB
resources.ap_ 326KB
resources.ap_ 272KB
resources.ap_ 152KB
resources.ap_ 53KB
resources.ap_ 51KB
resources.ap_ 50KB
resources.ap_ 46KB
resources.ap_ 43KB
resources.ap_ 43KB
resources.ap_ 43KB
resources.ap_ 43KB
resources.ap_ 41KB
resources.ap_ 41KB
resources.ap_ 41KB
resources.ap_ 34KB
resources.ap_ 34KB
resources.ap_ 33KB
resources.ap_ 28KB
resources.ap_ 27KB
resources.ap_ 25KB
resources.ap_ 17KB
resources.ap_ 13KB
resources.ap_ 13KB
resources.ap_ 12KB
resources.ap_ 12KB
resources.ap_ 12KB
resources.ap_ 12KB
resources.ap_ 12KB
resources.ap_ 12KB
resources.ap_ 12KB
resources.ap_ 12KB
resources.ap_ 12KB
resources.ap_ 12KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 11KB
resources.ap_ 10KB
resources.ap_ 10KB
resources.ap_ 10KB
resources.ap_ 2KB
Sample9_5.apk 616KB
Sample7_8.apk 597KB
Sample7_10.apk 381KB
Sample7_6.apk 361KB
Sample7_9.apk 335KB
Sample14_2.apk 313KB
Sample11_1.apk 163KB
Sample8_7.apk 67KB
Sample11_10.apk 65KB
Sample13_9.apk 62KB
Sample7_3.apk 61KB
Sample13_8.apk 61KB
Sample8_2.apk 55KB
Sample8_1.apk 54KB
Sample8_3.apk 53KB
Sample7_2.apk 52KB
Sample7_1.apk 51KB
Sample2_1.apk 50KB
Sample9_3.apk 45KB
Sample8_5.apk 44KB
Sample9_2.apk 44KB
Sample9_1.apk 42KB
Sample8_4.apk 38KB
Sample9_6.apk 37KB
Sample14_1.apk 34KB
Sample8_6.apk 28KB
Sample7_7.apk 26KB
Sample2_10.apk 24KB
Sample6_6.apk 23KB
Sample6_9.apk 22KB
Sample6_10.apk 22KB
Sample6_3.apk 22KB
Sample6_5.apk 22KB
Sample7_4.apk 22KB
Sample6_7.apk 22KB
Sample6_4.apk 22KB
Sample6_8.apk 22KB
Sample11_9.apk 21KB
Sample6_2.apk 21KB
Sample6_1.apk 21KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
likesyour
- 粉丝: 57
- 资源: 63
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python-leetcode面试题解之第152题乘积最大子数组-题解.zip
- python-leetcode面试题解之第151题反转字符串中的单词-题解.zip
- python-leetcode面试题解之第150题逆波兰表达式求值-题解.zip
- python-leetcode面试题解之第149题直线上最多的点数-题解.zip
- python-leetcode面试题解之第148题排序链表-题解.zip
- python-leetcode面试题解之第147题对链表进行插入排序-题解.zip
- python-leetcode面试题解之第146题LRU缓存-题解.zip
- python-leetcode面试题解之第145题二叉树的后序遍历-题解.zip
- python-leetcode面试题解之第144题二叉树的前序遍历-题解.zip
- python-leetcode面试题解之第143题重排链表-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功