opengl实现太阳系天体运动(5)

2019-08-31 23:39

if(xRot < -1.0f) xRot = 355.0f;

if(yRot > 356.0f) yRot = 0.0f;

if(yRot < -1.0f) yRot = 355.0f;

// Refresh the Window

glutPostRedisplay();// this will refresh the window, so, it works the same to call RenderScene() directly }

void DrawAxis() {

//绘制x、y、z坐标轴 {

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

glBegin( GL_LINES ); {

// x-axis

glVertex3f( 0.0f, 0.0f, 0.0f); glVertex3f( 200.0f, 0.0f, 0.0f);

// x-axis arrow

glVertex3f( 200.0f, 0.0f, 0.0f); glVertex3f( 193.0f, 3.0f, 0.0f); glVertex3f( 200.0f, 0.0f, 0.0f); glVertex3f( 193.0f,-3.0f, 0.0f); } glEnd();

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

glBegin( GL_LINES ); {

// y-axis

glVertex3f( 0.0f, 0.0f, 0.0f); glVertex3f( 0.0f, 200.0f, 0.0f); glVertex3f( 0.0f, 200.0f, 0.0f); glVertex3f( 3.0f, 193.0f, 0.0f); glVertex3f( 0.0f, 200.0f, 0.0f); glVertex3f( -3.0f, 193.0f, 0.0f); } glEnd();

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

glBegin( GL_LINES ); { // z-axis glVertex3f( 0.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 0.0f, 200.0f ); glVertex3f( 0.0f, 0.0f, 200.0f ); glVertex3f( 0.0f, 3.0f, 193.0f ); glVertex3f( 0.0f, 0.0f, 200.0f ); glVertex3f( 0.0f, -3.0f, 193.0f); } glEnd(); } } 程序运行效果图:

4、投影变换

投影变换就是定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上。(注意,从现在起,坐标可以不再是-1.0到1.0了!)

OpenGL支持两种类型的投影变换,即透视投影和正投影。投影也是使用矩阵来实现的。如果需要操作投影矩阵,需要以GL_PROJECTION为参数调用glMatrixMode函数。

glMatrixMode(GL_PROJECTION);

通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。 glLoadIdentity();

透视投影所产生的结果类似于照片,有近大远小的效果,比如在火车头内向前照一个铁轨的照片,两条铁轨似乎在远处相交了。

使用glFrustum函数可以将当前的可视空间设置为透视投影空间。 也可以使用更常用的gluPerspective函数。

正投影相当于在无限远处观察得到的结果,它只是一种理想状态。但对于计算机来说,使用正投影有可能获得更好的运行速度。

使用glOrtho函数可以将当前的可视空间设置为正投影空间

如果绘制的图形空间本身就是二维的,可以使用gluOrtho2D。他的使用类似于glOrgho。

5、视口变换

当一切工作已经就绪,只需要把像素绘制到屏幕上了。这时候还剩最后一个问题:应该把像素绘制到窗口的哪个区域呢?通常情况下,默认是完整的填充整个窗口,但我们完全可以只填充一半。(即:把整个图象填充到一半的窗口内) 使用glViewport来定义视口。其中前两个参数定义了视口的左下脚(0,0表示最左下方),后两个参数分别是宽度和高度。 6、加上光源

// Purpose: To show how to draw the solar system // Author: zieckey // Date: 2009/10/7 #include \ #include #include // Rotation amounts

static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f;

void SpecialKeys(int key, int x, int y); void ChangeSize( GLsizei w, GLsizei h ); void DrawAxis(); void SetupRC();

void RenderScene() {

//清空颜色缓冲区,填充的颜色由 glClearColor( 0, 0.0, 0.0, 1 ); 指定为黑色

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Save matrix state and do the rotation

glPushMatrix();

glRotatef(xRot, 1.0f, 0.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 0.0f);

//glTranslatef( 0, 0, -200 );//将整个场景移动到视野中

DrawAxis();


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

下一篇:人工智能

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

马上注册会员

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