opengles绘制圆柱体(光照+纹理)

Modern OpenGL绘制圆柱体 本文主要介绍如何使用 C++ 生成圆柱几何体以及如何在 OpenGL 中绘制它。 1.绘制方法 由于我们无法绘制一个完美的圆形底面和圆柱体的弯曲侧面,我们只能通过将底面除以扇区(切片)来采样有限数量的点。因此,它在技术上是通过将这些采样点连接在一起来构建棱柱体。随着样本数量的增加,几何形状更接近于圆柱体。 假设一个圆柱体以原点为中心,半径为r,高度为h。圆柱体上的任意点 ( x, y, z ) 可以从具有相应扇形角θ的圆方程计算出来: 扇形角的范围是从 0 到 360 度。每个步骤的扇形角可以通过以下方 阅读详情

转自:http://blog.youkuaiyun.com/hb707934728/article/details/52439920

先看效果图



圆面的绘制:

[java]  view plain  copy
  1. package test.com.opengles8_1;  
  2.   
  3.   
  4.   
  5. import java.nio.ByteBuffer;  
  6. import java.nio.ByteOrder;  
  7. import java.nio.FloatBuffer;  
  8. import android.opengl.GLES20;  
  9. /** 
  10.  * Created by hbin on 2016/9/5. 
  11.  * 圆面 
  12.  */  
  13. public class Circle {  
  14.     int mProgram;//自定义渲染管线着色器程序id  
  15.     int muMVPMatrixHandle;//总变换矩阵引用  
  16.     int maPositionHandle; //顶点位置属性引用  
  17.     int maTexCoorHandle; //顶点纹理坐标属性引用  
  18.     int muMMatrixHandle;  
  19.   
  20.     int maCameraHandle; //摄像机位置属性引用  
  21.     int maNormalHandle; //顶点法向量属性引用  
  22.     int maLightLocationHandle;//光源位置属性引用  
  23.   
  24.   
  25.     String mVertexShader;//顶点着色器代码脚本  
  26.     String mFragmentShader;//片元着色器代码脚本  
  27.   
  28.     FloatBuffer   mVertexBuffer;//顶点坐标数据缓冲  
  29.     FloatBuffer   mTexCoorBuffer;//顶点纹理坐标数据缓冲  
  30.     FloatBuffer   mNormalBuffer;//顶点法向量数据缓冲  
  31.     int vCount=0;  
  32.     float xAngle=0;//绕x轴旋转的角度  
  33.     float yAngle=0;//绕y轴旋转的角度  
  34.     float zAngle=0;//绕z轴旋转的角度  
  35.   
  36.     public Circle(MySurfaceView mv,float scale,float r,int n)  
  37.     {  
  38.         //调用初始化顶点数据的initVertexData方法  
  39.         initVertexData(scale,r,n);  
  40.         //调用初始化着色器的intShader方法  
  41.         initShader(mv);  
  42.     }  
  43.   
  44.     public void initVertexData(  
  45.             float scale,//大小  
  46.             float r,//半径  
  47.             int n //切分的份数  
  48.     ){  
  49.         r=r*scale;  
  50.         float angdegSpan=360.0f/n;//顶角的度数  
  51.         vCount=3*n;//顶点个数,共有n个三角形,每个三角形都有3个顶点  
  52.   
  53.         float[] vertices=new float[vCount*3];//顶点坐标数据  
  54.         float[] textures=new float[vCount*2];//顶点纹理S,T坐标值数组  
  55.   
  56.         //坐标数据初始化  
  57.         int count=0;  
  58.         int stCount=0;  
  59.         for (float angdeg=0;Math.ceil(angdeg)<360;angdeg+=angdegSpan){  
  60.             double angrad=Math.toRadians(angdeg);//当前弧度  
  61.             double angradNext=Math.toRadians(angdeg+angdegSpan);//下一弧度  
  62.   
  63.             //中心点  
  64.             vertices[count++]=0;//顶点坐标  
  65.             vertices[count++]=0;  
  66.             vertices[count++]=0;  
  67.   
  68.             textures[stCount++]=0.5F;//ST坐标  
  69.             textures[stCount++]=0.5f;  
  70.   
  71.             //当前点  
  72.             vertices[count++]=(float)(-r*Math.sin(angrad));//顶点坐标  
  73.             vertices[count++]=(float)(r*Math.cos(angrad));  
  74.             vertices[count++]=0;  
  75.   
  76.             textures[stCount++]=(float)(0.5-0.5*Math.sin(angrad));//st坐标  
  77.             textures[stCount++]=(float)(0.5-0.5*Math.cos(angrad));  
  78.   
  79.             //下一点  
  80.             vertices[count++]=(float)(-r*Math.sin(angradNext));//顶点坐标  
  81.             vertices[count++]=(float)(r*Math.cos(angradNext));  
  82.             vertices[count++]=0;  
  83.   
  84.             textures[stCount++]=(float)(0.5-0.5*Math.sin(angradNext));//st坐标  
  85.             textures[stCount++]=(float)(0.5-0.5*Math.cos(angradNext));  
  86.         }  
  87.   
  88.         ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);//创建顶点坐标数据缓冲  
  89.         vbb.order(ByteOrder.nativeOrder());//设置字节顺序为本地操作系统顺序  
  90.         mVertexBuffer = vbb.asFloatBuffer();//转换为float型缓冲  
  91.         mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据  
  92.         mVertexBuffer.position(0);//设置缓冲区起始位置  
  93.         //法向量数据初始化-用于计算光照  
  94.         float[] normals=new float[vertices.length];  
  95.         for(int i=0;i<normals.length;i+=3){  
  96.             normals[i]=0;  
  97.             normals[i+1]=0;  
  98.             normals[i+2]=1;  
  99.         }  
  100.         ByteBuffer nbb = ByteBuffer.allocateDirect(normals.length*4);//创建顶点法向量数据缓冲  
  101.         nbb.order(ByteOrder.nativeOrder());//设置字节顺序为本地操作系统顺序  
  102.         mNormalBuffer = nbb.asFloatBuffer();//转换为float型缓冲  
  103.         mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据  
  104.         mNormalBuffer.position(0);//设置缓冲区起始位置  
  105.   
  106.         //纹理坐标数据初始化  
  107.         ByteBuffer cbb = ByteBuffer.allocateDirect(textures.length*4);//创建顶点纹理数据缓冲  
  108.         cbb.order(ByteOrder.nativeOrder());//设置字节顺序为本地操作系统顺序  
  109.         mTexCoorBuffer = cbb.asFloatBuffer();//转换为float型缓冲  
  110.         mTexCoorBuffer.put(textures);//向缓冲区中放入顶点纹理数据  
  111.         mTexCoorBuffer.position(0);//设置缓冲区起始位置  
  112.     }  
  113.   
  114.     //自定义初始化着色器initShader方法  
  115.     public void initShader(MySurfaceView mv){  
  116.         //加载顶点着色器的脚本内容  
  117.         mVertexShader=ShaderUtil.loadFromAssetsFile("vertex_tex_light.sh", mv.getResources());  
  118.         //加载片元着色器的脚本内容  
  119.         mFragmentShader=ShaderUtil.loadFromAssetsFile("frag_tex_light.sh", mv.getResources());  
  120.         //基于顶点着色器与片元着色器创建程序  
  121.         mProgram = ShaderUtil.createProgram(mVertexShader, mFragmentShader);  
  122.         //获取程序中顶点位置属性引用id  
  123.         maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");  
  124.         //获取程序中顶点纹理坐标属性引用id  
  125.         maTexCoorHandle= GLES20.glGetAttribLocation(mProgram, "aTexCoor");  
  126.         //获取程序中总变换矩阵引用id  
  127.         muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");  
  128.         //获取程序中顶点法向量属性引用id  
  129.         maNormalHandle= GLES20.glGetAttribLocation(mProgram, "aNormal");  
  130.         //获取程序中摄像机位置引用id  
  131.         maCameraHandle=GLES20.glGetUniformLocation(mProgram, "uCamera");  
  132.         //获取程序中光源位置引用id  
  133.         maLightLocationHandle=GLES20.glGetUniformLocation(mProgram, "uLightLocation");  
  134.         //获取位置、旋转变换矩阵引用id  
  135.         muMMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMMatrix");  
  136.     }  
  137.   
  138.     public void drawSelf(int texId)  
  139.     {  
  140.         //制定使用某套shader程序  
  141.         GLES20.glUseProgram(mProgram);  
  142.   
  143.         //将最终变换矩阵传入shader程序  
  144.         GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);  
  145.   
  146.         //将位置、旋转变换矩阵传入shader程序  
  147.         GLES20.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);  
  148.         //将摄像机位置传入shader程序  
  149.         GLES20.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB);  
  150.         //将光源位置传入shader程序  
  151.         GLES20.glUniform3fv(maLightLocationHandle, 1, MatrixState.lightPositionFB);  
  152.   
  153.   
  154.         //传送顶点位置数据  
  155.         GLES20.glVertexAttribPointer  
  156.                 (  
  157.                         maPositionHandle,  
  158.                         3,  
  159.                         GLES20.GL_FLOAT,  
  160.                         false,  
  161.                         3*4,  
  162.                         mVertexBuffer  
  163.                 );  
  164.         //传送顶点纹理坐标数据  
  165.         GLES20.glVertexAttribPointer  
  166.                 (  
  167.                         maTexCoorHandle,  
  168.                         2,  
  169.                         GLES20.GL_FLOAT,  
  170.                         false,  
  171.                         2*4,  
  172.                         mTexCoorBuffer  
  173.                 );  
  174.         //传送顶点法向量数据  
  175.         GLES20.glVertexAttribPointer  
  176.                 (  
  177.                         maNormalHandle,  
  178.                         4,  
  179.                         GLES20.GL_FLOAT,  
  180.                         false,  
  181.                         3*4,  
  182.                         mNormalBuffer  
  183.                 );  
  184.   
  185.         //启用顶点位置数据  
  186.         GLES20.glEnableVertexAttribArray(maPositionHandle);  
  187.         //启用顶点纹理数据  
  188.         GLES20.glEnableVertexAttribArray(maTexCoorHandle);  
  189.         //启用顶点法向量数据  
  190.         GLES20.glEnableVertexAttribArray(maNormalHandle);  
  191.   
  192.   
  193.         //绑定纹理  
  194.         GLES20.glActiveTexture(GLES20.GL_TEXTURE0);  
  195.         GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId);  
  196.   
  197.         //绘制纹理矩形  
  198.         GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, vCount);  
  199.     }  
  200. }  
圆柱侧面的绘制

[java]  view plain  copy
  1. package test.com.opengles8_1;  
  2.   
  3. import android.opengl.GLES20;  
  4.   
  5. import java.nio.ByteBuffer;  
  6. import java.nio.ByteOrder;  
  7. import java.nio.FloatBuffer;  
  8.   
  9. /** 
  10.  * Created by hbin on 2016/9/5. 
  11.  * 圆柱侧面 
  12.  */  
  13. public class CylinderSide {  
  14.     int mProgram;//自定义渲染管线着色器程序id  
  15.     int muMVPMatrixHandle;//总变换矩阵引用  
  16.     int maPositionHandle; //顶点位置属性引用  
  17.     int maTexCoorHandle; //顶点纹理坐标属性引用  
  18.   
  19.     int muMMatrixHandle;//位置、旋转、缩放变换矩阵  
  20.     int maCameraHandle; //摄像机位置属性引用  
  21.     int maNormalHandle; //顶点法向量属性引用  
  22.     int maLightLocationHandle;//光源位置属性引用  
  23.   
  24.   
  25.     String mVertexShader;//顶点着色器代码脚本  
  26.     String mFragmentShader;//片元着色器代码脚本  
  27.   
  28.     FloatBuffer mVertexBuffer;//顶点坐标数据缓冲  
  29.     FloatBuffer   mTexCoorBuffer;//顶点纹理坐标数据缓冲  
  30.     FloatBuffer   mNormalBuffer;//顶点法向量数据缓冲  
  31.     int vCount=0;  
  32.     float xAngle=0;//绕x轴旋转的角度  
  33.     float yAngle=0;//绕y轴旋转的角度  
  34.     float zAngle=0;//绕z轴旋转的角度  
  35.   
  36.     public CylinderSide(MySurfaceView mv,float scale,float r,float h,int n)  
  37.     {  
  38.         //调用初始化顶点数据的initVertexData方法  
  39.         initVertexData(scale,r,h,n);  
  40.         //调用初始化着色器的intShader方法  
  41.         initShader(mv);  
  42.     }  
  43.   
  44.     //自定义初始化顶点坐标数据的方法  
  45.     public void initVertexData(  
  46.             float scale,    //大小  
  47.             float r,        //半径  
  48.             float h,        //高度  
  49.             int n           //切分的份数  
  50.     )  
  51.     {  
  52.         r=scale*r;  
  53.         h=scale*h;  
  54.   
  55.         float angdegSpan=360.0f/n;  
  56.         vCount=3*n*4;//顶点个数,共有3*n*4个三角形,每个三角形都有三个顶点  
  57.         //坐标数据初始化  
  58.         float[] vertices=new float[vCount*3];  
  59.         float[] textures=new float[vCount*2];//顶点纹理S、T坐标值数组  
  60.         //坐标数据初始化  
  61.         int count=0;  
  62.         int stCount=0;  
  63.         for(float angdeg=0;Math.ceil(angdeg)<360;angdeg+=angdegSpan)//侧面  
  64.         {  
  65.             double angrad=Math.toRadians(angdeg);//当前弧度  
  66.             double angradNext=Math.toRadians(angdeg+angdegSpan);//下一弧度  
  67.             //底圆当前点---0  
  68.             vertices[count++]=(float) (-r*Math.sin(angrad));  
  69.             vertices[count++]=0;  
  70.             vertices[count++]=(float) (-r*Math.cos(angrad));  
  71.   
  72.             textures[stCount++]=(float) (angrad/(2*Math.PI));//st坐标  
  73.             textures[stCount++]=1;  
  74.             //顶圆下一点---3  
  75.             vertices[count++]=(float) (-r*Math.sin(angradNext));  
  76.             vertices[count++]=h;  
  77.             vertices[count++]=(float) (-r*Math.cos(angradNext));  
  78.   
  79.             textures[stCount++]=(float) (angradNext/(2*Math.PI));//st坐标  
  80.             textures[stCount++]=0;  
  81.             //顶圆当前点---2  
  82.             vertices[count++]=(float) (-r*Math.sin(angrad));  
  83.             vertices[count++]=h;  
  84.             vertices[count++]=(float) (-r*Math.cos(angrad));  
  85.   
  86.             textures[stCount++]=(float) (angrad/(2*Math.PI));//st坐标  
  87.             textures[stCount++]=0;  
  88.   
  89.             //底圆当前点---0  
  90.             vertices[count++]=(float) (-r*Math.sin(angrad));  
  91.             vertices[count++]=0;  
  92.             vertices[count++]=(float) (-r*Math.cos(angrad));  
  93.   
  94.             textures[stCount++]=(float) (angrad/(2*Math.PI));//st坐标  
  95.             textures[stCount++]=1;  
  96.             //底圆下一点---1  
  97.             vertices[count++]=(float) (-r*Math.sin(angradNext));  
  98.             vertices[count++]=0;  
  99.             vertices[count++]=(float) (-r*Math.cos(angradNext));  
  100.   
  101.             textures[stCount++]=(float) (angradNext/(2*Math.PI));//st坐标  
  102.             textures[stCount++]=1;  
  103.             //顶圆下一点---3  
  104.             vertices[count++]=(float) (-r*Math.sin(angradNext));  
  105.             vertices[count++]=h;  
  106.             vertices[count++]=(float) (-r*Math.cos(angradNext));  
  107.   
  108.             textures[stCount++]=(float) (angradNext/(2*Math.PI));//st坐标  
  109.             textures[stCount++]=0;  
  110.         }  
  111.         //法向量数据初始化  
  112.         float[] normals=new float[vertices.length];  
  113.         for(int i=0;i<vertices.length;i++){  
  114.             if(i%3==1){  
  115.                 normals[i]=0;  
  116.             }else{  
  117.                 normals[i]=vertices[i];  
  118.             }  
  119.         }  
  120.   
  121.   
  122.         ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);//创建顶点坐标数据缓冲  
  123.         vbb.order(ByteOrder.nativeOrder());//设置字节顺序为本地操作系统顺序  
  124.         mVertexBuffer = vbb.asFloatBuffer();//转换为float型缓冲  
  125.         mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据  
  126.         mVertexBuffer.position(0);//设置缓冲区起始位置  
  127.   
  128.         ByteBuffer nbb = ByteBuffer.allocateDirect(vertices.length*4);//创建顶点法向量数据缓冲  
  129.         nbb.order(ByteOrder.nativeOrder());//设置字节顺序为本地操作系统顺序  
  130.         mNormalBuffer = nbb.asFloatBuffer();//转换为float型缓冲  
  131.         mNormalBuffer.put(normals);//向缓冲区中放入顶点法向量数据  
  132.         mNormalBuffer.position(0);//设置缓冲区起始位置  
  133.   
  134.         //st坐标数据初始化  
  135.         ByteBuffer cbb = ByteBuffer.allocateDirect(textures.length*4);//创建顶点纹理数据缓冲  
  136.         cbb.order(ByteOrder.nativeOrder());//设置字节顺序为本地操作系统顺序  
  137.         mTexCoorBuffer = cbb.asFloatBuffer();//转换为float型缓冲  
  138.         mTexCoorBuffer.put(textures);//向缓冲区中放入顶点纹理数据  
  139.         mTexCoorBuffer.position(0);//设置缓冲区起始位置  
  140.     }  
  141.   
  142.     //自定义初始化着色器的initShader方法  
  143.     public void initShader(MySurfaceView mv)  
  144.     {  
  145.         //加载顶点着色器的脚本内容  
  146.         mVertexShader=ShaderUtil.loadFromAssetsFile("vertex_tex_light.sh", mv.getResources());  
  147.         //加载片元着色器的脚本内容  
  148.         mFragmentShader=ShaderUtil.loadFromAssetsFile("frag_tex_light.sh", mv.getResources());  
  149.         //基于顶点着色器与片元着色器创建程序  
  150.         mProgram = ShaderUtil.createProgram(mVertexShader, mFragmentShader);  
  151.         //获取程序中顶点位置属性引用id  
  152.         maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");  
  153.         //获取程序中顶点纹理坐标属性引用id  
  154.         maTexCoorHandle= GLES20.glGetAttribLocation(mProgram, "aTexCoor");  
  155.         //获取程序中总变换矩阵引用id  
  156.         muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");  
  157.   
  158.         //获取程序中顶点法向量属性引用id  
  159.         maNormalHandle= GLES20.glGetAttribLocation(mProgram, "aNormal");  
  160.         //获取程序中摄像机位置引用id  
  161.         maCameraHandle=GLES20.glGetUniformLocation(mProgram, "uCamera");  
  162.         //获取程序中光源位置引用id  
  163.         maLightLocationHandle=GLES20.glGetUniformLocation(mProgram, "uLightLocation");  
  164.         //获取位置、旋转变换矩阵引用id  
  165.         muMMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMMatrix");  
  166.   
  167.   
  168.     }  
  169.   
  170.     public void drawSelf(int texId)  
  171.     {  
  172.         //制定使用某套shader程序  
  173.         GLES20.glUseProgram(mProgram);  
  174.         //将最终变换矩阵传入shader程序  
  175.         GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, MatrixState.getFinalMatrix(), 0);  
  176.         //将位置、旋转变换矩阵传入shader程序  
  177.         GLES20.glUniformMatrix4fv(muMMatrixHandle, 1, false, MatrixState.getMMatrix(), 0);  
  178.         //将摄像机位置传入shader程序  
  179.         GLES20.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB);  
  180.         //将光源位置传入shader程序  
  181.         GLES20.glUniform3fv(maLightLocationHandle, 1, MatrixState.lightPositionFB);  
  182.   
  183.         //传送顶点位置数据  
  184.         GLES20.glVertexAttribPointer  
  185.                 (  
  186.                         maPositionHandle,  
  187.                         3,  
  188.                         GLES20.GL_FLOAT,  
  189.                         false,  
  190.                         3*4,  
  191.                         mVertexBuffer  
  192.                 );  
  193.         //传送顶点纹理坐标数据  
  194.         GLES20.glVertexAttribPointer  
  195.                 (  
  196.                         maTexCoorHandle,  
  197.                         2,  
  198.                         GLES20.GL_FLOAT,  
  199.                         false,  
  200.                         2*4,  
  201.                         mTexCoorBuffer  
  202.                 );  
  203.         //传送顶点法向量数据  
  204.         GLES20.glVertexAttribPointer  
  205.                 (  
  206.                         maNormalHandle,  
  207.                         4,  
  208.                         GLES20.GL_FLOAT,  
  209.                         false,  
  210.                         3*4,  
  211.                         mNormalBuffer  
  212.                 );  
  213.   
  214.         //启用顶点位置数据  
  215.         GLES20.glEnableVertexAttribArray(maPositionHandle);  
  216.         //启用顶点纹理数据  
  217.         GLES20.glEnableVertexAttribArray(maTexCoorHandle);  
  218.         //启用顶点法向量数据  
  219.         GLES20.glEnableVertexAttribArray(maNormalHandle);  
  220.         //绑定纹理  
  221.         GLES20.glActiveTexture(GLES20.GL_TEXTURE0);  
  222.         GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId);  
  223.   
  224.         //绘制纹理矩形  
  225.         GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount);  
  226.     }  
  227.   
  228. }  

圆面和圆柱侧面公式推导过程

Unity光学反射3D显示:Pepper‘s Cone项目全解析与复现指南 3D显示技术通过光学原理和计算机图形学,将虚拟物体以立体形式呈现。其核心在于利用光学反射和人眼视觉特性,结合数字预畸变算法,将2D图像转换为具有深度感的3D影像。这项技术的价值在于以低成本实现沉浸式视觉体验,广泛应用于教育展示、创意艺术和互动娱乐领域。本文以Unity引擎和移动设备为基础,深入解析如何通过光学反射与预畸变技术,构建一个简易的3D全息显示装置。项目涉及陀螺仪数据融合、渲染纹理和着色器编程等关键技术,通过DIY透明圆锥和平板电脑的组合,实现动态立体视觉效果,为增强现实(AR)和计算机图形学学习提 阅读详情

相关推荐

用5毫欧采样电阻实现高精度电流检测?数字可调电源控制板的硬件设计陷阱

本文深入探讨了在数字可调电源控制板设计中,如何利用5毫欧采样电阻实现高精度电流检测。从微小信号放大电路设计、采样电阻布局与热管理,到电源切换与电池管理电路优化,提供了全面的硬件设计解决方案和实用技巧,帮助工程师规避常见设计陷阱,提升系统性能。

wdx0123456的博客 1030

OpenGLES:绘制一个混色旋转的3D圆柱

圆柱绘制的关键点就是将圆柱拆解成:两个Z坐标不为0的圆 + 一个长方形的圆柱面

肖云鹤的博客 2295

程序化广告行业(2/89):从程序化广告深挖数据处理技巧

大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一本程序化广告手册,深入挖掘数据处理的更多技巧。这本手册涵盖了程序化广告从概念到技术实现的诸多方面,而其中处处都涉及到数据处理,相信会给我们带来不少收获

yyy173611的博客 4572

OpenGL绘制圆柱体

圆柱体是3D图形中的基本图形之一。下面是一个使用OpenGL绘制圆柱体的示例代码。 #include <GL/glut.h> #include <math.h> void drawCylinder(float radius, float height, int slices) { GLUquadric *quadric = gluNewQuadric(); ...

weixin_42593130的博客 1074

Elsevier投稿避坑指南:Ocean Engineering论文格式要求详解(附Checklist模板)

本文详细解析Elsevier旗下期刊Ocean Engineering的投稿格式要求与常见陷阱,提供实用的Checklist模板。涵盖文章类型确认、作者贡献声明、图表规范、数据声明等关键环节,帮助研究者高效通过格式审查。特别强调LaTeX排版细节、图表分辨率要求及现代伦理声明规范,助力海洋工程领域学者顺利投稿。

weixin_33734785的博客 1500

手把手教你利用qemu搭建银河麒麟V11 arm环境

在Windows环境下,初学者或企业用户常通过VMware、VirtualBox等虚拟机软件安装Ubuntu、Red Hat等Linux系统,这类工具更侧重X86等复杂指令集架构(CISC,常见于Intel、AMD处理器)的虚拟化。而QEMU是一款开源的虚拟机监视器与模拟器,核心优势在于可模拟ARM、MIPS、RISC-V等精简指令集架构(RISC)的处理器并提供虚拟化能力,更适合对虚拟化技术有一定了解的用户。可能是电脑性能问题,安装过程比较慢,需要耐心等待。等操作系统下载完成后,进行安装了。

huanhuanzhou blog 2455

Android OpenGLES2.0(六)——构建圆锥、圆柱和球体

之前的博客中,我们绘制了三角形、正方形、圆形、立方体,今天我们将绘制圆锥、圆柱和球体。能够绘制这些基本的常规几何形体后,其他的常见几何形体的绘制对于我们来说就基本没问题了。绘制圆锥由之前的博客,我们大家也应该都知道了,OpenGL ES2.0中物体的绘制重点就是在于把这个物体表面分解成三角形,分解成功后,绘制自然就不成问题了。圆锥我们很容易就能想到把它拆解成一个圆形和一个锥面,锥面的顶点与圆形的顶点

偶尔记录的一些学习笔记 1万+

天池长期赛:二手车价格预测(422方案分享)

本次比赛是一次很好的锻炼数据挖掘能力的入门赛,从EDA-数据清洗-特征工程-模型调参-模型融合,能够完整的学习到大数据的分析和挖掘,值得历练。

weixin_46685991的博客 1万+

opengl实现任意两点间画圆柱体

1,问题提出两点间画线简单:glBegin(GL_LINES);  //注意是LINES不是LINE,这个错误一定要注意。 glVertexf(x1, y1, z1); glVertexf(x2, y2, z2);glEnd();画线函数不会影响opengl的矩阵堆栈。 但是很多时候线条效果会比较差,比如我要做一个骨骼动画,关节点间的骨头用线条太难看,即使使用glLin

dizuo的专栏 1万+

三菱 FX5U PLC 4轴程序 控制松下伺服3个, 步进电机一个

三菱 FX5U PLC 4轴程序。 控制松下伺服3个, 步进电机一个, 四轴自动堆垛码垛设备程序, 回原点动作用专用的原点回归指令写的, 手动运行用三菱相对定位指令写的 , 自动运行用绝对定位指令写的取料运行, 表格定位写的自动放料运行, 设备各种报警异常都有写出 程序每一步都有注释。 包括PLC程序、显控触摸屏 程序、松下伺服驱动器接线图。 程序内都有IO注释 编号:4816635519484681汇美0808 ...

m0_68069172的博客 3381

OpenClaw 子代理配对失败问题分析与解决方案

OpenClaw子代理配对失败问题分析与解决方案 问题核心在于agent设备权限不足,仅有operator.approvals权限而缺少operator.admin权限,导致子代理启动时形成权限死锁。本文提供三种解决方案: 直接编辑设备配对文件(推荐):修改本地JSON文件,为agent设备添加完整operator.admin权限,操作简单快捷。 标准重新配对流程:删除现有agent设备后重新配对,通过正常审批流程获取完整权限,符合系统安全设计。 修改源码降低权限要求(仅限开发环境):调整子代理代码避免强制

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 151

android opengl es bitmap,android使用OPENGL ES绘制圆柱体

本文实例为大家分享了android使用OPENGL ES绘制圆柱体的具体代码,供大家参考,具体内容如下效果图:编写jiem.java*指定屏幕所要显示的假面,并对见、界面进行相关设置*为Activity设置恢复处理,当Acitvity恢复设置时显示界面同样应该恢复*当Activity暂停设置时,显示界面同样应该暂停package com.scout.eeeeeee;import android.a...

weixin_40009099的博客 363

【STM32+K210项目】基于K210智能人脸识别+车牌识别系统(完整工程资料源码)

随着时代的进步和科技的迅猛发展,人们对居住安全的重视程度不断提升,对安全防范系统的需求也日益增强。在安防系统中,门禁系统占据着重要的位置。传统的门禁控制方式主要依靠钥匙、密码和门禁卡等,这些方式易于被破解和复制,安全性较低。然而,近年来,生物识别技术的迅速发展和成熟,为解决这一问题提供了新的方案。生物识别技术具备便携性、非易失性、不易遗忘以及难以盗用等优点,逐渐被引入到门禁系统中。传统的小区门禁系统往往依赖人工管理,存在一定的局限性,难以满足用户多样化的需求,也浪费了人力资源。

嵌入式技术开发 1万+

Android+3D游戏开发技术详解与典型案例

内容导读  本书共分两篇,第一篇介绍了Android 3D游戏开发的基础知识,主要对OpenGL ES的相关内容进行了介绍。  章 名主 要 内 容  第1章 英雄还看今朝—Android简介本章介绍了市场上主流的手机平台,同时也分析了未来手机平台的发展趋势及Android平台的前景  第2章 数风流人物—当前流行游戏类型简介本章以分类的方式简要地介绍了当前流行的游戏的玩法,游戏的视觉效果,游...

weixin_30697239的博客 155

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Opengl ES

1:项目介绍 2:Opengl ES概述 3:基本图形绘制 4:3D图形绘制及透视 5:光效 6:材质 7:纹理及纹理映射 8:隧道实例 9: 雾气 10:2D文字显示 11:飘动的旗帜 12:蒙板 13:离子系统 14:变形 15:多级纹理--圆柱体 -球体 16:曲面映射 17:多重纹理 18:反射(剪裁平面,蒙板缓存) 19:图像字体 20:反走样 2...

iteye_661的博客 132

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Unity 6与Quest 3S开发VR化学实验室:架构、交互与性能优化实战

虚拟现实(VR)技术通过模拟三维环境,为用户提供沉浸式体验,其核心原理在于实时渲染与空间交互。在移动VR设备上实现这一体验,尤其需要平衡视觉真实感与硬件性能。Unity引擎作为主流的实时内容开发平台,其XR工具包和渲染管线为VR应用开发提供了强大支持。本文聚焦于利用Unity 6的新特性与Meta Quest 3S的硬件特性,探讨如何构建一个可交互的VR化学实验室。通过模块化架构设计,将化学实体与反应规则数据驱动化,并基于规则进行状态模拟,在保证基础科学逻辑的同时规避了复杂的物理计算。针对移动VR的性能挑战

weixin_34006965的博客 326

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android OpenGL绘制圆柱体

许多应用程序通过合并简单的图形来构建更复杂的物体,我们即将学习如何进行这样的操作,本篇我们将学习如何构建立体图形,我们先从圆柱体开始。 在这里,我们还需要一个简便的方法来在场景中进行平移、旋转和移动。许多三维应用程序通过使用视图矩阵来实现这些功能;对视图矩阵所做的更改将影响整个场景,就像我们通过一个移动的相机观察事物一样。我们将添加一个视图矩阵,以使旋转和移动变得更加容易。

ZLGSPACE的博客 1834

openGL创建平面、立方体、圆柱体、斜面和棱柱Demo

OpenGL 创建平面、立方体、圆柱体、斜面和棱柱 Demo

zq9955的博客 858

OpenGL中SolidCylinder的绘制

glu中提供了一个绘制圆柱体的函数:   void gluCylinder( GLUquadric* quad,    GLdouble base,    GLdouble top,    GLdouble height,    GLint slices,    GLint stacks )使用方法是:GLUquadric *pObj; pObj = gluNewQuadric();

dizuo的专栏 9357

C# OpenGL 绘制圆柱

C# OpenGL 绘制圆柱 并随轴旋转

Jacksonan的博客 1081

opengl--圆锥和圆柱光照和纹理

圆锥和圆柱光照和纹理 由于在圆锥的侧面中和底面圆中,重合的底面圆上的点的法向量是不同的,同时在纹理贴图时候,必有在同一个圆上位置,此处有两个顶点,其中一个的纹理索引是起始点,另一个是终点。 若将底面圆类在实现时,等同于被分为m个线段,则圆锥总的顶底需要一个底面圆心+底面圆周的点+侧面扇形上顶点+等同于m的圆锥顶点。即共需要顶点(m+1)*3+1个。 法向量和纹理: 在圆锥中: 顶点数组中,索引为1到m+1个的底面圆上的点、索引为0的底面圆心组成底面圆,法向量为垂直于圆平面单位向量。侧面上的法向量,例如对于索

coding的博客 1319

OpenGLES2.0基础:缓存/模型,剪裁/走样算法(4)

&gt; opengl着色模型与渲染模型 opengl学习笔记之指定着色模型- http://blog.youkuaiyun.com/my_lord_/article/details/55253299-- OpenGL的各种着色器    OpenGL的着色器是新一代显卡提供给开发者一个小程序,为的是让开发者对光照、坐标转换以及像素进行一些个性化的处理。OpenGL的着色器有一种专门的语言:GLSL,现在的GL...

ShareUs的专栏 1367

OpenGLES入门笔记 :OpenGLES光照基础总结1

背景最近开始入门OpenGLES,学习光照相关的知识。其中遇到不少问题,走了不少弯路,下面简要总结一下最近的问题以及自己的一些认识,有不正确的地方希望大家指正。光照的原理首先说明的一点是这里我们主要讨论OpenGLES2.0下的光照。学习光照之前,我们已经做过一些场景,虽然这其中并没有涉及到光的概念,但是我们依然能看到带颜色物体,以及各种图片纹理。所以可以确定的是,没有光照我们依然能看到东西,而不是

lidec的专栏 2212

OpenGLES:绘制一个混色旋转的3D圆锥

圆锥的拆解很简单,有两种方式可以理解: 2D圆的圆心从圆平面里抽离出来,赋予一个Z值 2D的圆心和圆平面分别赋予不同的Z值

肖云鹤的博客 2201
上一篇: opengles绘制圆锥体(光照+纹理)
下一篇: OpenGL图像缩放的不同插值类型
KirogiYi
博客等级 码龄15年 49粉丝 87原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值