效果图:

底面:

侧面:

底面圆核心代码:

    //初始化顶点数据的方法public void initVertexData(){// 顶点坐标数据的初始化================begin============================ArrayList<Float> alVertix = new ArrayList<Float>();// 存放顶点坐标的ArrayListArrayList<Float> texVertix = new ArrayList<Float>();// 存放纹理坐标final int angleSpan = 10;final float UNIT_SIZE=1f;final float UNIT_SIZE_2=0.3f;for (int hAngle = 0; hAngle <= 360; hAngle = hAngle + angleSpan){//顶点坐标float x0 = 0;float y0 = 0;float z0= 0;float z1= (float) (r * UNIT_SIZE * Math.cos(Math.toRadians(hAngle)));float y1= 0;float x1= (float) (r * UNIT_SIZE * Math.sin(Math.toRadians(hAngle)));float z2 = (float) (r * UNIT_SIZE * Math.cos(Math.toRadians(hAngle+ angleSpan)));float y2= 0;float x2= (float) (r * UNIT_SIZE * Math.sin(Math.toRadians(hAngle+ angleSpan)));//纹理坐标float tex_s=0.5f;float tex_p=0.5f;float tex_s1= (float) (UNIT_SIZE_2 * Math.cos(Math.toRadians(hAngle)))+0.5f;float tex_p1= (float) (UNIT_SIZE_2 * Math.sin(Math.toRadians(hAngle)))+0.5f;float tex_s2 = (float) (UNIT_SIZE_2 * Math.cos(Math.toRadians(hAngle+ angleSpan)))+0.5f;float tex_p2= (float) (UNIT_SIZE_2 * Math.sin(Math.toRadians(hAngle+ angleSpan)))+0.5f;alVertix.add(x0);alVertix.add(y0);alVertix.add(z0);alVertix.add(x1);alVertix.add(y1);alVertix.add(z1);alVertix.add(x2);alVertix.add(y2);alVertix.add(z2);texVertix.add(tex_s);texVertix.add(tex_p);texVertix.add(tex_s1);texVertix.add(tex_p1);texVertix.add(tex_s2);texVertix.add(tex_p2);}vCount = alVertix.size() / 3;// 顶点的数量为坐标值数量的1/3,因为一个顶点有3个坐标// 将alVertix中的坐标值转存到一个float数组中float vertices[] = new float[vCount * 3];for (int i = 0; i < alVertix.size(); i++) {vertices[i] = alVertix.get(i);}float texCoor[]=new float[vCount * 2];//顶点颜色值数组,每个顶点4个色彩值RGBAfor (int i = 0; i < texVertix.size(); i++) {texCoor[i] = texVertix.get(i);}//创建顶点坐标数据缓冲//vertices.length*4是因为一个整数四个字节ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);vbb.order(ByteOrder.nativeOrder());//设置字节顺序mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据mVertexBuffer.position(0);//设置缓冲区起始位置//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题//顶点坐标数据的初始化================end============================//顶点纹理坐标数据的初始化================begin============================//创建顶点纹理坐标数据缓冲ByteBuffer cbb = ByteBuffer.allocateDirect(texCoor.length*4);cbb.order(ByteOrder.nativeOrder());//设置字节顺序mTexCoorBuffer = cbb.asFloatBuffer();//转换为Float型缓冲mTexCoorBuffer.put(texCoor);//向缓冲区中放入顶点纹理数据mTexCoorBuffer.position(0);//设置缓冲区起始位置//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题//顶点纹理坐标数据的初始化

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

 public void initVertexData(){// 顶点坐标数据的初始化================begin============================ArrayList<Float> texVertix = new ArrayList<Float>();// 存放顶点坐标的ArrayListArrayList<Float> alVertix = new ArrayList<Float>();// // 存放纹理坐标final int angleSpan = 10;//底面圆划分度数final float wangleSpan = 3.16f;//扇形划分度数final float UNIT_SIZE=1f;final float UNIT_SIZE_2=0.5f;//扇形圆心final int mult_r = 3;float h=mult_r*r * UNIT_SIZE;for (int hAngle = 0; hAngle <= 360; hAngle = hAngle + angleSpan)// 水平方向angleSpan度一份{float x0 = 0;float y0 = h;float z0= 0;float x1= (float) (r * UNIT_SIZE * Math.cos(Math.toRadians(hAngle)));float y1= 0;float z1= (float) (r * UNIT_SIZE * Math.sin(Math.toRadians(hAngle)));float x2 = (float) (r * UNIT_SIZE * Math.cos(Math.toRadians(hAngle+ angleSpan)));float y2= 0;float z2= (float) (r * UNIT_SIZE * Math.sin(Math.toRadians(hAngle+ angleSpan)));alVertix.add(x2);alVertix.add(y2);alVertix.add(z2);alVertix.add(x1);alVertix.add(y1);alVertix.add(z1);alVertix.add(x0);alVertix.add(y0);alVertix.add(z0);}for (float vAngle = 33.08f; vAngle <=146.92; vAngle = vAngle + wangleSpan)// 水平方向angleSpan度一份113.84{float tex_s0= 0.5f;float tex_p0= 0.18f;float tex_s1= (float) (UNIT_SIZE_2* Math.cos(Math.toRadians(vAngle)))+0.5f;float tex_p1 = (float) (UNIT_SIZE_2* Math.sin(Math.toRadians(vAngle)))+0.18f;float tex_s2= (float) (UNIT_SIZE_2 * Math.cos(Math.toRadians(vAngle + wangleSpan)))+0.5f;float tex_p2 = (float) (UNIT_SIZE_2 * Math.sin(Math.toRadians(vAngle + wangleSpan)))+0.18f;texVertix.add(tex_s2);texVertix.add(tex_p2);texVertix.add(tex_s1);texVertix.add(tex_p1);texVertix.add(tex_s0);texVertix.add(tex_p0);}vCount = alVertix.size() / 3;// 顶点的数量为坐标值数量的1/3,因为一个顶点有3个坐标// 将alVertix中的坐标值转存到一个float数组中float vertices[] = new float[vCount * 3];for (int i = 0; i < alVertix.size(); i++) {vertices[i] = alVertix.get(i);}float texCoor[]=new float[vCount * 2];//顶点颜色值数组,每个顶点4个色彩值RGBAfor (int i = 0; i < texVertix.size(); i++) {texCoor[i] = texVertix.get(i);}//创建顶点坐标数据缓冲//vertices.length*4是因为一个整数四个字节ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);vbb.order(ByteOrder.nativeOrder());//设置字节顺序mVertexBuffer = vbb.asFloatBuffer();//转换为Float型缓冲mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据mVertexBuffer.position(0);//设置缓冲区起始位置//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题//顶点坐标数据的初始化================end============================//顶点纹理坐标数据的初始化================begin============================//创建顶点纹理坐标数据缓冲ByteBuffer cbb = ByteBuffer.allocateDirect(texCoor.length*4);cbb.order(ByteOrder.nativeOrder());//设置字节顺序mTexCoorBuffer = cbb.asFloatBuffer();//转换为Float型缓冲mTexCoorBuffer.put(texCoor);//向缓冲区中放入顶点纹理数据mTexCoorBuffer.position(0);//设置缓冲区起始位置//特别提示:由于不同平台字节顺序不同数据单元不是字节的一定要经过ByteBuffer//转换,关键是要通过ByteOrder设置nativeOrder(),否则有可能会出问题//顶点纹理坐标数据的初始化================end============================}

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

android opengl es 圆锥纹理贴图相关推荐

  1. 2.x最终照着教程,成功使用OpenGL ES 绘制纹理贴图,添加了灰度图

    在之前成功绘制变色的几何图形之后,今天利用Openg ES的可编程管线绘制出第一张纹理. 学校时候不知道OpenGL的重要性,怕晦涩的语法.没有跟老师学习OpenGL的环境配置,现在仅仅能利用coco ...

  2. 2.x终于照着教程,成功使用OpenGL ES 绘制纹理贴图,增加了灰度图

    在之前成功绘制变色的几何图形之后,今天利用Openg ES的可编程管线绘制出第一张纹理.学校时候不知道OpenGL的重要性,怕晦涩的语法,没有跟老师学习OpenGL的环境配置,如今只能利用cocos2 ...

  3. 【OpenGL ES】凸镜贴图

    1 前言 正方形图片贴到圆形上 中将正方形图片上的纹理映射到圆形模型上,同理,也可以将圆形上的纹理映射到凸镜的球形曲面上.如下图,最左边的竖条是原图片的截面(纹理坐标),最右边的竖条是变换后的顶点模型 ...

  4. Android OpenGL ES视频渲染(一)GLSurfaceView

    相关文章:Android OpenGL ES视频渲染(二)EGL+OpenGL Android中视频渲染有几种方式,之前的文章使用的是nativewindow(包括softwareRender).今天 ...

  5. 【OpenGL ES】立方体贴图(6张图)

    1 前言 本文通过一个立方体贴图的例子,讲解三维纹理贴图的应用,案例中使用 6 张不同的图片给立方体贴图,图片如下: 本文涉及到的知识点主要包含:三维绘图.MVP 矩阵变换.纹理贴图,读者如果对 Op ...

  6. Android OpenGl Es 学习(二):定义顶点和着色器

    概述 这是一个新的系列,学习OpengGl Es,其实是<OpenGl Es 应用开发实践指南 Android卷>的学习笔记,感兴趣的可以直接看这本书,当然这个会记录自己的理解,以下只作为 ...

  7. Android OpenGL ES 学习(九) – 坐标系统和实现3D效果

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  8. OpenGl文章 Android OpenGL ES 简明开发教程

    Android OpenGL ES 简明开发教程 分类:android学习笔记2011-12-14 15:04375人阅读评论(0)收藏举报 ApiDemos 的Graphics示例中含有OpenGL ...

  9. Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

最新文章

  1. 万字长文!DeepMind科学家总结2021年的15个高能研究
  2. 搭建高效、可靠、稳定的WEB服务器
  3. JVM,JDK,JRE和OpenJDK有什么区别?
  4. WF单元测试系列3:测试Activity的行为
  5. c语言测验答案,C语言测验题答案.doc
  6. OpenCV跟踪支持的实例(附完整源代码)
  7. 大表与大表join数据倾斜_技术分享|大数据技术初探之Spark数据倾斜调优
  8. 集卡php源码,独角数卡自动发卡网PHP源码+教程:虚拟产品自助售卖
  9. java mysql geo_GEO数据库简介
  10. 言图科技:GPU服务器选型
  11. Python分析「我们为什么这么穷」
  12. Spring 数据处理框架的演变
  13. java 数字 下划线_数字文字中的下划线– Java 7功能
  14. 5G催化、VR回春,千亿行业洗牌重来
  15. fer2013人脸表情数据实践
  16. 【软考】专栏导读(软考全面介绍、资格报考建议)
  17. 《吐血整理》-顶级程序员书单集
  18. 曲面的法向量+高斯公式曲面的方向余弦的计算
  19. css能不能实现剪切蒙版,CSS中图形剪切、遮罩功能-及使用说明
  20. 基于ZYNQ的VGA驱动

热门文章

  1. python学习之面向对象编程--搬家具
  2. 原生JS实现PC端无缝滚动轮播图、匀速轮播图、匀速动画
  3. 什么是GeoJSON?
  4. CC00016.kylin——|HadoopOLAP_Kylin.V16|——|Kylin.v16|Cube优化|检查Cuboid数量|
  5. Android10及以上访问公有目录
  6. 以太坊挖矿源码:ethash算法
  7. SAP付款方式与 订单客户组
  8. 理解DCT与DST【二】:离散余弦变换
  9. 一个Java讲师在培训过程中用到的工具【随时更新中】
  10. wy的leetcode刷题记录_Day45