`
erikchang
  • 浏览: 50496 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

使用OpenGL 面分解法绘制虚拟地球之我见

    博客分类:
  • vc
阅读更多

   OpenGL绘制几何图形,本人认为关键的一步在于建立物体的几何模型。我们通过不同的规则来对同一个物体建模,将会得到很不相同的结果。把物体的模型建设好,即能用数学表达式来表达或说构建出一个物体,那么用OpenGL将其画出来或说表达出来,将不会是一件很困难的事情。如何建立球体模型呢?

由于我们实际的生活经验不难发现,地球可以抽象为一个理想的球体,而地球的定位一般是通过经度纬度值。也就是说只要有二个参数就基本上可以确定一个球体上的点的几何位置。基于此,首先可用经纬特征来构建一个球体模型。假想好球体也分为南北二极,再选取一个点为经度的零点,这样便可以把球体想成是由很多的水平圆和竖直圆来包围着的。而这些圆与圆的交点就构造出了很多的小平面,我们画球的目的就是要将这些小平面一个个画出来。每个小平面再分为二个三角面,这样使每个经纬相交的点对应着二个小三角面。4个顶点由经纬度是容易确定的,从而2个小三角面也就易于在OpenGL中勾画出来。

    参数v1,v2,v3为初始三角面的三个顶点向量,count记录当前要分解的级数,也就是当前该面要进行等分的次数。若count = 0,则不需要等分,而直接以初始三个顶点画三角面。若count = 1,则要等分一次,若count = 2,则要进行二次等分,最终该原始三角面将被分为1*4*4 = 16个。依次类推。程序实现代码如下:

void CVRworkView::SubDivide(float *v1, float *v2, float *v3, int count)
{
	//count为等分级数
	if(0 >= count)		//count=0,则画由三点构成的三角形
	{
		DrawTriangle(v1,v2,v3);
	}
	else
	{
		GLfloat v12[3],v23[3],v31[3];
		GLint i;
		for(i = 0; i < 3; i++){
			v12[i] = (v1[i]+v2[i])/2;		//求取等分的中点坐标
			v23[i] = (v2[i]+v3[i])/2;
			v31[i] = (v3[i]+v1[i])/2;
		}
		Normalize(v12,(float)m_nRadius);	//将所得中点进行模长扩展
		Normalize(v23,(float)m_nRadius);
		Normalize(v31,(float)m_nRadius);
	
		SubDivide(v1,v12,v31,count-1);	//对所产生的4个新的三角面再进行等分
		SubDivide(v2,v23,v12,count-1);
		SubDivide(v3,v31,v23,count-1);
		SubDivide(v12,v23,v31,count-1);
	}
}

 

 

   前面讲述的是大众的面分解法,实际中初始面(初始图形)的设计是有一定艺术水平的。初始图形构造的好,不仅图形的空间位置易于确定,而且也容易构造出更逼真的图形。在一般的参考书上,球体的初始图形是一个正20面体,当然,这是一个很好的办法。但在本次设计中,球体的初始图形设置为由6个点构成的8面体,之所以这样做,是因为这样更有利于理解球体图形的生成,而且这样也方便确定各点的空间坐标。所构成的图形如下图所示述:

      

 

 

 

 

 

 

这样就可以如下来绘制球体:

void CVRworkView::DrawGeometry()
{
	GLfloat r = (GLfloat)m_nRadius;
	GLfloat vdata[6][3] = {		//初始点坐标
		{r,0.0,0.0},{-r,0.0,0.0},
		{0.0,r,0.0},{0.0,-r,0.0},
		{0.0,0.0,r},{0.0,0.0,-r}
	};
	GLuint tindices[8][3] = {	//初始面的构造
		{2,4,0},{2,0,5},{2,5,1},{2,1,4},
		{3,0,4},{3,5,0},{3,1,5},{3,4,1}
	};

	for(int i = 0; i < 8; i++){		//绘制球体
		SubDivide(&vdata[tindices[i][0]][0],
			&vdata[tindices[i][1]][0],
			&vdata[tindices[i][2]][0],m_nCount);
	}
}

 

每个面又是由2个三角形组成,如下绘制每个三角形:

void CVRworkView::DrawTriangle(float *v1, float *v2, float *v3)
{
	//以三点为顶点画三角形
	GLfloat normal[3] = {0,0,0};
	NormalTriangle(v1,v2,v3,normal);		//求取面法向量
	glBegin(m_nPattern);
		glNormal3fv(normal);
		glVertex3fv(v1);
		glVertex3fv(v2);
		glVertex3fv(v3);
	glEnd();
}

 

 

 最终形成的球面如下:



 

  • 大小: 12.7 KB
  • 大小: 9.6 KB
  • 大小: 8.5 KB
  • 大小: 12.4 KB
分享到:
评论

相关推荐

    opengl绘制太阳、地球、月球

    以上就是使用OpenGL绘制太阳、地球、月球时涉及的关键技术点。通过这些技术,我们可以创建一个动态、交互的3D模型,模拟太阳系中的天文现象,让用户在虚拟环境中探索宇宙的奥秘。在“work”文件夹中,应包含了项目的...

    android OpenGL ES 地球仪绘制——球体绘制及纹理映射——源码

    在Android上实现地球仪的绘制,通常涉及到OpenGL ES的几个关键概念和技术,包括基本几何形状的构建、纹理映射以及触摸事件处理。下面我们将详细探讨这些知识点。 1. **OpenGL ES 绘制三角形拼成球体** - 在3D空间...

    Opengl 绘制的地球

    在这个"OpenGL绘制的地球"项目中,我们看到的是如何利用OpenGL的技术来创建一个动态的、具有真实感的地球模型。以下是对这个主题的详细解释: 1. **OpenGL基础知识**:OpenGL是一个跨语言、跨平台的编程接口,用于...

    openGL绘制虚拟教室

    这是我用openGL绘制的虚拟教室,有各种教室必备物品,代码已测试通过,能实现漫游功能,含可执行程序和源码

    OpenGL中绘制太阳,地球,月亮的运动模型

    本项目聚焦于使用OpenGL来创建一个动态的天文模型,模拟太阳、地球和月亮的运动。这个模型对于教育、演示天文学原理以及软件开发练习都非常有价值。 首先,我们要理解OpenGL的基本概念。OpenGL是一个基于向量图形的...

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

    在本压缩包文件中,我们重点关注如何使用OpenGL来绘制管道,特别是U型口的实现。 OpenGL提供了一个强大的图形管线(Pipeline),它将复杂的图形处理分为多个阶段,包括顶点处理、几何变换、光栅化和像素操作等。在...

    iOS使用OpenGLes绘制地球

    在iOS上使用OpenGLes模拟月球绕地球公转,iOS OpenGLes图形开发入门必看,iOS开发进阶资源

    OpenGL绘制简单地图

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

    openGL增强表面细节,模拟地球表面地形

    1.openGL增强表面细节,模拟地球表面地形,使用高度贴图实现 2.现在我们扩展法线贴图的概念——从纹理图像用于扰动法向量到扰乱顶点位置本身。实 际上,以这种方式修改对象的几何体具有一定的优势,例如使表面特征...

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

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

    使用OpenGL高效绘制文字和图片.rar

    C#使用OpenGL高效绘制任意文字和图片(不需要建立字库,不使用第三方库). 帧率可以到达每秒钟两千帧以上! 使用时在代码中修改图片的路径. 说明:OpenGL绘制文字一直是一个难点,网络上很多是使用Freetype第三方库来绘制...

    27.OpenGL入门及绘制基本图形(一)1

    在OpenGL中,绘制正方形通常通过定义四个顶点来完成,然后使用glBegin()和glEnd()函数包围顶点序列,使用glVertex2f()等函数指定每个顶点的位置。例如: ```python glBegin(GL_QUADS) glVertex2f(-0.5, -0.5) ...

    利用OpenGL绘制棋盘格

    OpenGL不直接提供绘制矩形的函数,但可以通过绘制两个三角形来构建一个矩形,使用`glBegin`和`glEnd`包围顶点序列,并用`glVertex2f`指定每个顶点的坐标。 5. **颜色设置**:使用`glColor3f`函数可以设置绘制的颜色...

    qt opengl模拟地球—月球模型

    在本文中,我们将深入探讨如何使用Qt和OpenGL创建一个地月模型,模拟月球围绕地球旋转的场景,并结合光照和纹理技术,使画面更具真实感。Qt是一个强大的跨平台应用程序开发框架,而OpenGL则是一种标准的图形库,用于...

    OpenGL实验二:绘制钟表.zip

    OpenGL实验二:绘制钟表.zip是一个包含纯C语言编写的OpenGL程序,用于在屏幕上绘制一个动态更新的钟表。这个程序特别适用于学习和理解OpenGL的基本概念以及如何在三维空间中进行图形绘制。以下是对该实验代码的主要...

Global site tag (gtag.js) - Google Analytics