android opengl es 圆锥纹理贴图

雨点打透心脏的1/2处 2022-02-04 12:17 363阅读 0赞

效果图:
在这里插入图片描述
底面:
在这里插入图片描述
侧面:
在这里插入图片描述
底面圆核心代码:

  1. //初始化顶点数据的方法
  2. public void initVertexData()
  3. {
  4. // 顶点坐标数据的初始化================begin============================
  5. ArrayList<Float> alVertix = new ArrayList<Float>();// 存放顶点坐标的ArrayList
  6. ArrayList<Float> texVertix = new ArrayList<Float>();// 存放纹理坐标
  7. final int angleSpan = 10;
  8. final float UNIT_SIZE=1f;
  9. final float UNIT_SIZE_2=0.3f;
  10. for (int hAngle = 0; hAngle <= 360; hAngle = hAngle + angleSpan)
  11. {
  12. //顶点坐标
  13. float x0 = 0;
  14. float y0 = 0;
  15. float z0= 0;
  16. float z1= (float) (r * UNIT_SIZE * Math.cos(Math.toRadians(hAngle)));
  17. float y1= 0;
  18. float x1= (float) (r * UNIT_SIZE * Math.sin(Math.toRadians(hAngle)));
  19. float z2 = (float) (r * UNIT_SIZE * Math.cos(Math.toRadians(hAngle+ angleSpan)));
  20. float y2= 0;
  21. float x2= (float) (r * UNIT_SIZE * Math.sin(Math.toRadians(hAngle+ angleSpan)));
  22. //纹理坐标
  23. float tex_s=0.5f;
  24. float tex_p=0.5f;
  25. float tex_s1= (float) (UNIT_SIZE_2 * Math.cos(Math.toRadians(hAngle)))+0.5f;
  26. float tex_p1= (float) (UNIT_SIZE_2 * Math.sin(Math.toRadians(hAngle)))+0.5f;
  27. float tex_s2 = (float) (UNIT_SIZE_2 * Math.cos(Math.toRadians(hAngle+ angleSpan)))+0.5f;
  28. float tex_p2= (float) (UNIT_SIZE_2 * Math.sin(Math.toRadians(hAngle+ angleSpan)))+0.5f;
  29. alVertix.add(x0);
  30. alVertix.add(y0);
  31. alVertix.add(z0);
  32. alVertix.add(x1);
  33. alVertix.add(y1);
  34. alVertix.add(z1);
  35. alVertix.add(x2);
  36. alVertix.add(y2);
  37. alVertix.add(z2);
  38. texVertix.add(tex_s);
  39. texVertix.add(tex_p);
  40. texVertix.add(tex_s1);
  41. texVertix.add(tex_p1);
  42. texVertix.add(tex_s2);
  43. texVertix.add(tex_p2);
  44. }
  45. vCount = alVertix.size() / 3;// 顶点的数量为坐标值数量的1/3,因为一个顶点有3个坐标
  46. // 将alVertix中的坐标值转存到一个float数组中
  47. float vertices[] = new float[vCount * 3];
  48. for (int i = 0; i < alVertix.size(); i++) {
  49. vertices[i] = alVertix.get(i);
  50. }
  51. float texCoor[]=new float[vCount * 2];//顶点颜色值数组,每个顶点4个色彩值RGBA
  52. for (int i = 0; i < texVertix.size(); i++) {
  53. texCoor[i] = texVertix.get(i);
  54. }
  55. //创建顶点坐标数据缓冲
  56. //vertices.length*4是因为一个整数四个字节
  57. ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
  58. vbb.order(ByteOrder.nativeOrder());//设置字节顺序
  59. mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲
  60. mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
  61. mVertexBuffer.position(0);//设置缓冲区起始位置
  62. //特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
  63. //转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
  64. //顶点坐标数据的初始化================end============================
  65. //顶点纹理坐标数据的初始化================begin============================
  66. //创建顶点纹理坐标数据缓冲
  67. ByteBuffer cbb = ByteBuffer.allocateDirect(texCoor.length*4);
  68. cbb.order(ByteOrder.nativeOrder());//设置字节顺序
  69. mTexCoorBuffer = cbb.asFloatBuffer();//转换为Float型缓冲
  70. mTexCoorBuffer.put(texCoor);//向缓冲区中放入顶点纹理数据
  71. mTexCoorBuffer.position(0);//设置缓冲区起始位置
  72. //特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
  73. //转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
  74. //顶点纹理坐标数据的初始化

侧面核心代码:
圆锥侧面展开为扇形,纹理坐标贴图时截取扇形部分。

  1. public void initVertexData()
  2. {
  3. // 顶点坐标数据的初始化================begin============================
  4. ArrayList<Float> texVertix = new ArrayList<Float>();// 存放顶点坐标的ArrayList
  5. ArrayList<Float> alVertix = new ArrayList<Float>();// // 存放纹理坐标
  6. final int angleSpan = 10;//底面圆划分度数
  7. final float wangleSpan = 3.16f;//扇形划分度数
  8. final float UNIT_SIZE=1f;
  9. final float UNIT_SIZE_2=0.5f;//扇形圆心
  10. final int mult_r = 3;
  11. float h=mult_r*r * UNIT_SIZE;
  12. for (int hAngle = 0; hAngle <= 360; hAngle = hAngle + angleSpan)// 水平方向angleSpan度一份
  13. {
  14. float x0 = 0;
  15. float y0 = h;
  16. float z0= 0;
  17. float x1= (float) (r * UNIT_SIZE * Math.cos(Math.toRadians(hAngle)));
  18. float y1= 0;
  19. float z1= (float) (r * UNIT_SIZE * Math.sin(Math.toRadians(hAngle)));
  20. float x2 = (float) (r * UNIT_SIZE * Math.cos(Math.toRadians(hAngle+ angleSpan)));
  21. float y2= 0;
  22. float z2= (float) (r * UNIT_SIZE * Math.sin(Math.toRadians(hAngle+ angleSpan)));
  23. alVertix.add(x2);
  24. alVertix.add(y2);
  25. alVertix.add(z2);
  26. alVertix.add(x1);
  27. alVertix.add(y1);
  28. alVertix.add(z1);
  29. alVertix.add(x0);
  30. alVertix.add(y0);
  31. alVertix.add(z0);
  32. }
  33. for (float vAngle = 33.08f; vAngle <=146.92; vAngle = vAngle + wangleSpan)// 水平方向angleSpan度一份113.84
  34. {
  35. float tex_s0= 0.5f;
  36. float tex_p0= 0.18f;
  37. float tex_s1= (float) (UNIT_SIZE_2* Math.cos(Math.toRadians(vAngle)))+0.5f;
  38. float tex_p1 = (float) (UNIT_SIZE_2* Math.sin(Math.toRadians(vAngle)))+0.18f;
  39. float tex_s2= (float) (UNIT_SIZE_2 * Math.cos(Math.toRadians(vAngle + wangleSpan)))+0.5f;
  40. float tex_p2 = (float) (UNIT_SIZE_2 * Math.sin(Math.toRadians(vAngle + wangleSpan)))+0.18f;
  41. texVertix.add(tex_s2);
  42. texVertix.add(tex_p2);
  43. texVertix.add(tex_s1);
  44. texVertix.add(tex_p1);
  45. texVertix.add(tex_s0);
  46. texVertix.add(tex_p0);
  47. }
  48. vCount = alVertix.size() / 3;// 顶点的数量为坐标值数量的1/3,因为一个顶点有3个坐标
  49. // 将alVertix中的坐标值转存到一个float数组中
  50. float vertices[] = new float[vCount * 3];
  51. for (int i = 0; i < alVertix.size(); i++) {
  52. vertices[i] = alVertix.get(i);
  53. }
  54. float texCoor[]=new float[vCount * 2];//顶点颜色值数组,每个顶点4个色彩值RGBA
  55. for (int i = 0; i < texVertix.size(); i++) {
  56. texCoor[i] = texVertix.get(i);
  57. }
  58. //创建顶点坐标数据缓冲
  59. //vertices.length*4是因为一个整数四个字节
  60. ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
  61. vbb.order(ByteOrder.nativeOrder());//设置字节顺序
  62. mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲
  63. mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
  64. mVertexBuffer.position(0);//设置缓冲区起始位置
  65. //特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
  66. //转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
  67. //顶点坐标数据的初始化================end============================
  68. //顶点纹理坐标数据的初始化================begin============================
  69. //创建顶点纹理坐标数据缓冲
  70. ByteBuffer cbb = ByteBuffer.allocateDirect(texCoor.length*4);
  71. cbb.order(ByteOrder.nativeOrder());//设置字节顺序
  72. mTexCoorBuffer = cbb.asFloatBuffer();//转换为Float型缓冲
  73. mTexCoorBuffer.put(texCoor);//向缓冲区中放入顶点纹理数据
  74. mTexCoorBuffer.position(0);//设置缓冲区起始位置
  75. //特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer
  76. //转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题
  77. //顶点纹理坐标数据的初始化================end============================
  78. }

demo地址:https://download.csdn.net/download/qq_21480607/11164846

发表评论

表情:
评论列表 (有 0 条评论,363人围观)

还没有评论,来说两句吧...

相关阅读

    相关 OpenGL纹理

    1.纹理贴图的步骤 1)创建纹理对象,并为它指定一个纹理。 glGenTextures() glGenerateMipmap() 2)确定纹理如何应用到每个像素上 g