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)和计算机图形学学习提 阅读详情

相关推荐

A股量化实战:用Python回测动量因子策略(附聚宽完整代码)

本文详细介绍了如何在A股市场使用Python和聚宽平台,实战回测一个动量因子量化交易策略。从环境搭建、数据获取到完整的策略代码实现与回测分析,手把手教你验证“强者恒强”的投资逻辑,并提供参数优化与实战避坑指南,助力量化新手迈出第一步。

weixin_29264201的博客 976

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

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

肖云鹤的博客 2295

Windows沙盒神器Sandboxie Plus保姆级教程:从安装到实战测试可疑软件

本文详细介绍了Windows沙盒神器Sandboxie Plus的安装、配置与实战应用,帮助用户安全测试可疑软件。从系统要求、安装步骤到核心功能如多沙盒管理、文件共享和快照恢复,全面解析了这款轻量级沙盒工具的优势与使用技巧,特别适合需要隔离运行未知程序的用户。

weixin_29323049的博客 1157

OpenGL绘制圆柱体

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

weixin_42593130的博客 1074

3分钟!教会你用 DeepSeek/Claude3.7+Cursor 快速入门AI编程(喂饭级教程)

3分钟!教会你用 DeepSeek/Claude3.7+Cursor 快速入门AI编程(喂饭级教程)

yizhen91y的博客 4725

C# Code-Behind 技术全面解析

Code-Behind 是 ASP.NET Web Forms 中的一种技术模式,通过将用户界面标记(.aspx文件)与程序逻辑代码(.aspx.cs文件)分离,实现表现层与逻辑层的解耦。其核心思想是前端展示与后台逻辑的物理文件分离,通过ASP.NET编译器将两者合并编译成一个Page类并执行。Code-Behind 的优势包括较好的代码组织、较高的开发效率,尤其适合快速开发数据驱动应用。然而,与现代开发模式如ASP.NET MVC、ASP.NET Core和Blazor相比,Code-Behind 在可维

记录学习的过程 958

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

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

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

2025反爬虫革命:京东商品接口的动态指纹认证与量子加密传输方案

在2025年,全球电商API接口面临的安全威胁呈现指数级增长:京东构建了基于硬件、软件、行为三重维度的设备指纹模型:京东构建了基于BB84+E91混合协议的量子密钥中继网络:

FB13713612741的博客 1649

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

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

dizuo的专栏 1万+

【YOLO26创新改进】TGRS 2026 | Transformer变体改进篇 | 使用CGTA曲率引导令牌注意力,改善结构与纹理的整体协调,适合遥感小目标检测、旋转目标检测、实例分割任务

本文在YOLO26目标检测模型中引入CGTA曲率引导令牌注意力模块,依据曲率显著性与特征可靠性,从高分辨率特征图中筛选少量关键令牌,再让全部位置与这些代表性特征进行全局交互,从而以较低计算和显存开销建立远距离目标、背景及跨尺度结构之间的联系;该模块能够重点强化车辆、舰船、飞机、建筑等目标的边缘、转角和弯曲轮廓,改善小目标、密集目标及旋转目标的特征完整性与定位稳定性,并通过可靠性门控抑制噪声和伪边缘,通过标准注意力与曲率注意力融合避免平坦区域被过度增强。

AI魔改博士-中大博士 47

利用恒源云云端GPU高效训练YOLOv11模型全流程:从环境搭建到模型部署,让你摆脱硬件束缚

记住,云端GPU的核心优势是“弹性算力+一键环境”,只要把握好这一工具特性,再结合YOLOv11的高性能模型架构,你也能在计算机视觉领域快速落地项目。接下来,我们从工具准备到模型部署,一步步带你实现高效训练,真正帮你解决资源与效率的核心痛点。凭借其在目标检测、实例分割任务上的卓越性能,成为众多开发者的首选。据统计,使用云端GPU训练YOLOv11,在处理百万级数据集时,训练效率较本地普通GPU提升。在安防监控中,YOLOv11可实时检测人员、车辆异常行为,某园区采用该方案后,异常事件识别准确率达。

LXY_LOVE36的博客 213

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

北斗导航 | 基于matlab的卫星导航单点定位算法

单点定位(Single Point Positioning, SPP)通过接收机观测至少4颗卫星的伪距(含误差的距离测量值),解算接收机位置(经度、纬度、高度)及钟差。HDOP < 2 为高精度定位条件。

尘世冰封的专栏 971

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

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

weixin_30697239的博客 155

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

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

weixin_34006965的博客 326

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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、付费专栏及课程。

余额充值