不解释,看代码:
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();
}
}
分享到:
相关推荐
在OpenGL中,实现这一效果通常涉及以下几个关键步骤: 1. **设置视景**:确定观察者的视角和相机位置,这将影响大气层的可见部分。 2. **构建几何体**:绘制一个代表地球的球体,并根据需要添加地形细节。 3. **...
1.openGL绘制天空盒背景 2.加入天空盒纹理 3.添加鼠标键盘事件
5. **几何处理**:在OpenGL中,几何处理包括图元装配(将顶点组合成图元,如线条或三角形)和细分(如果需要更平滑的表面,可以通过细分提高几何细节)。 6. **光栅化**:将几何图元转换为屏幕上的像素,这个阶段还...
在本案例中,我们将深入探讨如何使用OpenGL ES绘制一个天空盒。 天空盒是一种常见的3D图形技术,它通过在六面体的每个面上绘制全景图像来模拟无限远的天空背景,给人一种广阔无垠的空间感。这种技术可以有效减少...
使用FreeType接受Unicode字符集渲染到纹理。。。
5. **OpenGL中的模型绘制流程** 6. **OpenGL与C++结合进行图形开发** 7. **示例代码分析** #### OpenGL简介 OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API...
在 OpenGL 中,可以使用 Bezier 曲线来绘制平滑的曲线。Bezier 曲线是一种数学曲线,使用控制点来定义曲线的形状。 在本文中,我们将介绍如何使用 OpenGL 和鼠标事件来动态绘制三次 Bezier 曲线。三次 Bezier 曲线...
在OpenGL中,物体的形状由顶点定义,而这些顶点通过多边形连接形成几何体。茶壶模型就是一个这样的几何体,通常由多个三角面片组成。 光照是OpenGL中增强3D场景真实感的关键元素。OpenGL提供了多种光源模型,包括点...
OpenGL中的`glBegin()`和`glEnd()`函数用于标记开始和结束绘制,而`glVertex2f()`等函数用于指定每个顶点的位置。 4. **DrawTools类**:`DrawTools.cpp`和`DrawTools.h`文件可能包含了实现2D多边形绘制的类或函数。...
在OpenGL中,所有的图形都是由顶点构建的,通过连接这些顶点可以形成不同的几何形状,如三角形、四边形等。 对于球体的绘制,通常我们会采用基于球面坐标(经度和纬度)的方式来定义顶点。每个顶点的坐标可以通过...
在OpenGL中,这通常涉及`glfwPollEvents()`或类似的函数来检查用户输入,然后调用`glClear()`清除屏幕,`glDrawArrays()`或`glDrawElements()`绘制图形,最后`glFlush()`或`SwapBuffers()`确保图像显示。 9. **注释...
通过理解并运用以上知识点,我们可以在OpenGL中实现一个动态、可调整大小的棋盘格。在实际项目中,可能还需要考虑性能优化、错误处理以及与其他系统(如物理引擎或AI算法)的集成。对于初学者来说,这个项目是一个很...
【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 ) ...
Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板...
基于glut,读取点云文件 并进行绘制 包括用鼠标加键盘进行旋转、缩放、平移操作 使用VS2012编写
在这个主题中,我们将深入探讨如何使用OpenGL在三维空间中绘制立体五角星。这个项目涉及到的知识点包括三维坐标系统、几何变换、顶点坐标、颜色指定以及OpenGL的基本编程结构。 首先,三维空间中的五角星是由两个...
使用OpenGL绘制简单的地图 https://blog.csdn.net/ME__WE/article/details/84675155
【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 ) https://hanshuliang.blog.csdn.net/article/details/112768801 博客源码快照
在OpenGL中,很多高级特性都是通过扩展实现的,GLee库简化了这个过程,确保了在不同硬件上能正确使用这些扩展。 2. math3d.cpp 和 math3d.h:这是用于进行3D数学运算的库,包括向量和矩阵操作,对于进行坐标变换和...
【OpenGL】十九、OpenGL 绘制模式 ( 绘制线框模式 | 绘制点模式 ) https://hanshuliang.blog.csdn.net/article/details/112858006 ( 该源码是 Windows 桌面程序 , 使用 Visual Studio 2019 打开 )