`
micheal19840929
  • 浏览: 167372 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

OpenGL中半球形天空的绘制

阅读更多

不解释,看代码:

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绘制大气和天空

    在OpenGL中,实现这一效果通常涉及以下几个关键步骤: 1. **设置视景**:确定观察者的视角和相机位置,这将影响大气层的可见部分。 2. **构建几何体**:绘制一个代表地球的球体,并根据需要添加地形细节。 3. **...

    openGL绘制天空盒背景

    1.openGL绘制天空盒背景 2.加入天空盒纹理 3.添加鼠标键盘事件

    opengl.rar_OPENgl 管道_opengl绘制_opengl绘制管道_管道绘制

    5. **几何处理**:在OpenGL中,几何处理包括图元装配(将顶点组合成图元,如线条或三角形)和细分(如果需要更平滑的表面,可以通过细分提高几何细节)。 6. **光栅化**:将几何图元转换为屏幕上的像素,这个阶段还...

    opengles绘制天空盒

    在本案例中,我们将深入探讨如何使用OpenGL ES绘制一个天空盒。 天空盒是一种常见的3D图形技术,它通过在六面体的每个面上绘制全景图像来模拟无限远的天空背景,给人一种广阔无垠的空间感。这种技术可以有效减少...

    OpenGL、FreeType 中文纹理绘制

    使用FreeType接受Unicode字符集渲染到纹理。。。

    OpenGL实现的简单机器人绘制

    5. **OpenGL中的模型绘制流程** 6. **OpenGL与C++结合进行图形开发** 7. **示例代码分析** #### OpenGL简介 OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API...

    OpenGL下通过鼠标动态绘制三次Bezier曲线

    在 OpenGL 中,可以使用 Bezier 曲线来绘制平滑的曲线。Bezier 曲线是一种数学曲线,使用控制点来定义曲线的形状。 在本文中,我们将介绍如何使用 OpenGL 和鼠标事件来动态绘制三次 Bezier 曲线。三次 Bezier 曲线...

    opengl茶壶的绘制

    在OpenGL中,物体的形状由顶点定义,而这些顶点通过多边形连接形成几何体。茶壶模型就是一个这样的几何体,通常由多个三角面片组成。 光照是OpenGL中增强3D场景真实感的关键元素。OpenGL提供了多种光源模型,包括点...

    OpenGL实现的2D多边形绘制工具

    OpenGL中的`glBegin()`和`glEnd()`函数用于标记开始和结束绘制,而`glVertex2f()`等函数用于指定每个顶点的位置。 4. **DrawTools类**:`DrawTools.cpp`和`DrawTools.h`文件可能包含了实现2D多边形绘制的类或函数。...

    OpenGL球体绘制与球体贴图

    在OpenGL中,所有的图形都是由顶点构建的,通过连接这些顶点可以形成不同的几何形状,如三角形、四边形等。 对于球体的绘制,通常我们会采用基于球面坐标(经度和纬度)的方式来定义顶点。每个顶点的坐标可以通过...

    OpenGL实验二:绘制钟表.zip

    在OpenGL中,这通常涉及`glfwPollEvents()`或类似的函数来检查用户输入,然后调用`glClear()`清除屏幕,`glDrawArrays()`或`glDrawElements()`绘制图形,最后`glFlush()`或`SwapBuffers()`确保图像显示。 9. **注释...

    利用OpenGL绘制棋盘格

    通过理解并运用以上知识点,我们可以在OpenGL中实现一个动态、可调整大小的棋盘格。在实际项目中,可能还需要考虑性能优化、错误处理以及与其他系统(如物理引擎或AI算法)的集成。对于初学者来说,这个项目是一个很...

    OpenGL_十、OpenGL 绘制点

    【OpenGL】十、OpenGL 绘制点 ( 初始化 OpenGL 矩阵 | 设置投影矩阵 | 设置模型视图矩阵 | 绘制点 | 清除缓冲区 | 设置当前颜色值 | 设置点大小 | 绘制点 ) ...

    Qt+opengl模板测试,绘制物体轮廓

    Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板测试,绘制物体轮廓Qt+opengl模板...

    OpenGL读取点云文件并绘制

    基于glut,读取点云文件 并进行绘制 包括用鼠标加键盘进行旋转、缩放、平移操作 使用VS2012编写

    OpenGL 立体五角星 绘制

    在这个主题中,我们将深入探讨如何使用OpenGL在三维空间中绘制立体五角星。这个项目涉及到的知识点包括三维坐标系统、几何变换、顶点坐标、颜色指定以及OpenGL的基本编程结构。 首先,三维空间中的五角星是由两个...

    OpenGL绘制简单地图

    使用OpenGL绘制简单的地图 https://blog.csdn.net/ME__WE/article/details/84675155

    OpenGL_十二、OpenGL 绘制线段.zip

    【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 ) https://hanshuliang.blog.csdn.net/article/details/112768801 博客源码快照

    OpenGL的立方体纹理技术实现天空盒的绘制

    在OpenGL中,很多高级特性都是通过扩展实现的,GLee库简化了这个过程,确保了在不同硬件上能正确使用这些扩展。 2. math3d.cpp 和 math3d.h:这是用于进行3D数学运算的库,包括向量和矩阵操作,对于进行坐标变换和...

    【OpenGL】十九、OpenGL 绘制模式 ( 绘制线框模式 绘制点模式 ).zip

    【OpenGL】十九、OpenGL 绘制模式 ( 绘制线框模式 | 绘制点模式 ) https://hanshuliang.blog.csdn.net/article/details/112858006 ( 该源码是 Windows 桌面程序 , 使用 Visual Studio 2019 打开 )

Global site tag (gtag.js) - Google Analytics