opengl实现太阳系天体运动

2019-08-31 23:39

Opengl实现太阳系天体运动

本文主要讲OpenGL中的几何变换。

我们生活在一个三维的世界——如果要观察一个物体,我们可以: 1、从不同的位置去观察它。(视点变换/视图变换,gluLookAt)

2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)

3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换) 4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)

这些,都可以在OpenGL中实现。 1、模型变换和视图变换

从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。 由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,应先设置当前操作的矩阵为“模型视图矩阵”。设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样: glMatrixMode(GL_MODELVIEW); 通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。这也只需要一行代码: glLoadIdentity();

然后,就可以进行模型变换和视图变换了。进行模型和视图变换,主要涉及到三个函数:

glTranslate*,把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别表示了在三个坐标上的位移值。

glRotate*,把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。

glScale*,把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z分别表示在该方向上的缩放比例。

注意我都是说“与XX相乘”,而不是直接说“这个函数就是旋转”或者“这个函数就是移动”,这是有原因的,马上就会讲到。

假设当前矩阵为单位矩阵,然后先乘以一个表示旋转的矩阵R,再乘以一个表示移动的矩阵T,最后得到的矩阵再乘上每一个顶点的坐标矩阵v。所以,经过变换得到的顶点坐标就是((RT)v)。由于矩阵乘法的结合率,((RT)v) = (R(Tv)),换句话说,实际上是先进行移动,然后进行旋转。即:实际变换的顺序与代码中写的顺序是相反的。由于“先移动后旋转”和“先旋转后移动”得到的结果很可能不同,初学的时候需要特别注意这一点。

OpenGL之所以这样设计,是为了得到更高的效率。但在绘制复杂的三维图形时,如果每次都去考虑如何把变换倒过来,也是很痛苦的事情。这里介绍另一种思路,可以让代码看起来更自然(写出的代码其实完全一样,只是考虑问题时用的方法不同了)。

让我们想象,坐标并不是固定不变的。旋转的时候,坐标系统随着物体旋转。移

动的时候,坐标系统随着物体移动。如此一来,就不需要考虑代码的顺序反转的问题了。

运行结果:

#include #include

#include

#include

#pragma comment(lib, \) #pragma comment(lib, \) #pragma comment(lib, \)

void init() {

glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); }

void drawsquare( int width ) {

glRecti( -width/2, -width/2, width/2,}

void display() {

glClear(GL_COLOR_BUFFER_BIT);

//draw axis {

const float axislen = 300.0f; const float axislenh = axislen/2; glBegin(GL_LINES);

/2 ); width glColor3f( 0.0f, 1.0f, 0.0f );//指定线的颜色,绿色

// x-axis

glVertex2f( -axislenh, 0.0f); glVertex2f( axislenh, 0.0f);

// x-axis arrow

glVertex2f( axislenh, 0.0f); glVertex2f( axislenh-7, 3.0f); glVertex2f( axislenh, 0.0f); glVertex2f( axislenh-7,-3.0f);

glColor3f( 1.0f, 0.0f, 0.0f );//指定线的颜色,红色

// y-axis

glVertex2f( 0.0f, -axislenh); glVertex2f( 0.0f, axislenh); glVertex2f( 0.0f, axislenh); glVertex2f( 3.0f, axislenh-7); glVertex2f( 0.0f, axislenh); glVertex2f( -3.0f, axislenh-7); glEnd(); }

glMatrixMode( GL_MODELVIEW );

glPushMatrix();

/* 一个白色的正方形,先平移再旋转 */ glLoadIdentity();

glColor3f(1.0, 1.0, 1.0);

glTranslatef( 100.0f, 0.0f, 0.0f );//沿着x轴移动

glRotatef( 45, 0.0f, 0.0f, 1.0f );//沿着z轴旋转

drawsquare(50);

/* 一个红色的正方形,先旋转再平移 */ glLoadIdentity();

glColor3f(1.0, 0.0, 0.0);

glRotatef( 45, 0.0f, 0.0f, 1.0f );//沿着z轴旋转

glTranslatef( 100.0f, 0.0f, 0.0f );//沿着x轴移动

drawsquare(50);

glPopMatrix(); glFlush(); }

void reshape( int w, int h ) {

glViewport(0, 0, (GLsizei) w, (GLsizei) h);


opengl实现太阳系天体运动.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:人工智能

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: