不解释,看代码:
public class Dome {
private static final double DTOR=Math.PI/180;
private int horizonalSteps,portraitSteps;
private float radius; //半径
private Point3f[][][] vertex; //顶点坐标
private Point2f[][][] texCoords; //纹理坐标
/**
* 以原点为球心,绘制半球形天空
* @param radius 球的半径
* @param horizonalSteps 水平方向分割步数
* @param portraitSteps 垂直方向分割步数
*/
public Dome(float radius, int horizonalSteps, int portraitSteps) {
this.horizonalSteps=horizonalSteps;
this.portraitSteps=portraitSteps;
this.radius=radius;
float dtheta=(float)360/horizonalSteps; //水平方向步增
float dphi=(float)90/portraitSteps; //垂直方向步增
vertex=new Point3f[portraitSteps][][];
texCoords=new Point2f[portraitSteps][][];
for(int i=0,phi=0;i<portraitSteps;i++,phi+=dphi)
{
vertex[i]=new Point3f[horizonalSteps][];
texCoords[i]=new Point2f[horizonalSteps][];
for(int j=0,theta=0;j<horizonalSteps;j++,theta+=dtheta)
{
vertex[i][j]=new Point3f[4];
texCoords[i][j]=new Point2f[4];
Point3f point=new Point3f();
Point2f uv=new Point2f();
point.y = (float) (radius * Math.sin(phi*DTOR) * Math.cos(DTOR*theta));
point.x = (float) (radius * Math.sin(phi*DTOR) * Math.sin(DTOR*theta));
point.z = (float) (radius * Math.cos(phi*DTOR));
vertex[i][j][0]=point;
Vector3f vector=new Vector3f(point.x, point.y, point.z);
vector.normalize();
uv.x=(float)j/horizonalSteps;
uv.y=(float) (Math.asin(vector.z)/Math.PI*2);
texCoords[i][j][0]=uv;
point=new Point3f();
uv=new Point2f();
point.y = (float) (radius * Math.sin(phi*DTOR) * Math.cos(DTOR*(theta+dtheta)));
point.x = (float) (radius * Math.sin(phi*DTOR) * Math.sin(DTOR*(theta+dtheta)));
point.z = (float) (radius * Math.cos(phi*DTOR));
vertex[i][j][1]=point;
vector=new Vector3f(point.x, point.y, point.z);
vector.normalize();
uv.x=(float)(j+1)/horizonalSteps;
uv.y=(float) (Math.asin(vector.z)/Math.PI*2);
texCoords[i][j][1]=uv;
point=new Point3f();
uv=new Point2f();
point.y = (float) (radius * Math.sin((phi+dphi)*DTOR) * Math.cos(DTOR*(theta+dtheta)));
point.x = (float) (radius * Math.sin((phi+dphi)*DTOR) * Math.sin(DTOR*(theta+dtheta)));
point.z = (float) (radius * Math.cos((phi+dphi)*DTOR));
vertex[i][j][2]=point;
vector=new Vector3f(point.x, point.y, point.z);
vector.normalize();
uv.x=(float)(j+1)/horizonalSteps;
uv.y=(float) (Math.asin(vector.z)/Math.PI*2);
texCoords[i][j][2]=uv;
point=new Point3f();
uv=new Point2f();
point.y = (float) (radius * Math.sin((phi+dphi)*DTOR) * Math.cos(DTOR*theta));
point.x = (float) (radius * Math.sin((phi+dphi)*DTOR) * Math.sin(DTOR*theta));
point.z = (float) (radius * Math.cos((phi+dphi)*DTOR));
vertex[i][j][3]=point;
vector=new Vector3f(point.x, point.y, point.z);
vector.normalize();
uv.x=(float)j/horizonalSteps;
uv.y=(float) (Math.asin(vector.z)/Math.PI*2);
texCoords[i][j][3]=uv;
}
}
}
public int getHorizonalSteps() {
return horizonalSteps;
}
public int getPortraitSteps() {
return portraitSteps;
}
public float getRadius() {
return radius;
}
public Point3f[][][] getVertex() {
return vertex;
}
public void render()
{
GL11.glBegin(GL11.GL_QUADS);
for(int i=0;i<portraitSteps;i++)
{
for(int j=0;j<horizonalSteps;j++)
{
// GL11.glBegin(GL11.GL_LINE_LOOP);
for(int k=0;k<4;k++)
{
GL11.glTexCoord2f(texCoords[i][j][k].x,texCoords[i][j][k].y);
GL11.glVertex3f(vertex[i][j][k].x, vertex[i][j][k].z,vertex[i][j][k].y);
}
// GL11.glEnd();
}
}
GL11.glEnd();
}
}
分享到:
相关推荐
1.openGL绘制天空盒背景 2.加入天空盒纹理 3.添加鼠标键盘事件
OpenGL绘制大气和天空例子,包含简单的地球、大气、光照,很棒的效果。资源含论文和源码,亲测可用。分享给大家。
用opengl绘制管道u型口,用opengl绘制管道u型口
opengles绘制一个天空盒
使用FreeType接受Unicode字符集渲染到纹理。。。
1.构建天空盒的另一种方法是使用OpenGL 纹理立方体贴图。OpenGL 立方体贴图比我们 在上一节中看到的简单方法稍微复杂一点。但是,使用OpenGL 立方体贴图有自己的优点, 例如减少接缝以及支持环境贴图。 2.OpenGL ...
【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 ) ...
Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板...
用OpenGL实现的简单机器人绘制,包括头部和双手的旋转。
OpenGL下通过鼠标动态绘制三次Bezier曲线 有代码,截图
纯C语言写的OpenGL绘制钟表代码,编译器VS2010,钟表调用系统时间,表盘大小、刻度大小等可调,注释详尽,命名易懂
【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 ) https://hanshuliang.blog.csdn.net/article/details/112768801 博客源码快照
2.OpenGL安装 1.OpenGL绘制正方形 2.OpenGL绘制水壶 3.OpenGL绘制多个图形 4.OpenGL绘图代码及原理详解 1.OpenGL语
【OpenGL】十九、OpenGL 绘制模式 ( 绘制线框模式 | 绘制点模式 ) https://hanshuliang.blog.csdn.net/article/details/112858006 ( 该源码是 Windows 桌面程序 , 使用 Visual Studio 2019 打开 )
OpenGL 三角形内切圆绘制 OpenGL 三角形内切圆绘制 OpenGL 三角形内切圆绘制 OpenGL 三角形内切圆绘制 OpenGL 三角形内切圆绘制 http://blog.csdn.net/rorger/archive/2011/04/26/6365564.aspx
【OpenGL】十一、OpenGL 绘制多个点 ( 绘制单个点 | 绘制多个点 ) https://hanshuliang.blog.csdn.net/article/details/112766510 博客源码快照
C# OpenGL 三维立体图绘制 源码 用C#实现调用opengl实现三维图的绘制。如有问题,请发送邮件至gaocongly@126.com咨询讨论
opengl中天空盒的绘制,纹理的贴图,四周的移动
【OpenGL】十六、OpenGL 绘制四边形 ( 绘制 GL_QUADS 四边形 ) https://hanshuliang.blog.csdn.net/article/details/112850602 博客源码
【OpenGL】十八、OpenGL 绘制多边形 ( 绘制 GL_POLYGON 模式多边形 ) https://hanshuliang.blog.csdn.net/article/details/112855351 博客源码