OpenGL学习笔记 (5) —— 3D

    技术2022-05-20  64

    2011-04-14 wcdj

     

    现在开始生成真正的3D对象,而不是像前两节课中那样3D世界中的2D对象。给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔(四棱锥)。给正方形增加左、右、上、下及背面生成一个立方体。我们混合金字塔上的颜色,创建一个平滑着色的对象。给立方体的每一面则来个不同的颜色。 注意 : (1) 经常有人问:“我的对象怎么不会绕着其自身的轴旋转?看起来总是在满屏乱转。”要让您的对象绕自身的轴旋转,您必须让对象的中心坐标总是(0.0f, 0,0f, 0,0f)。 (2) 所有的面 —— 三角形都是逆时针次序 绘制的。这点十分重要,在以后的课程中我会作出解释。现在,您只需明白要么都逆时针,要么都顺时针,但永远不要将两种次序混在一起,除非您有足够的理由必须这么做。 (3) 还应注意到后面的三个侧面和前侧面处于同一个glBegin(GL_TRIANGLES)和glEnd()语句中间。因为我们是通过三角形来构造这个金字塔的。OpenGL知道每三个点构成一个三角形。当它画完一个三角形之后,如果还有余下的点出现,它就以为新的三角形要开始绘制了。OpenGL在这里并不会将四点画成一个四边形,而是假定新的三角形开始了 。所以千万不要无意中增加任何多余的点。 到这里您应该已经较好的掌握了在3D空间创建对象的方法。必须将OpenGL屏幕想象成一张很大的画纸 ,后面还带着许多透明的层。差不多就是个由大量的点组成的立方体。这些点从左至右、从上至下、从前到后的布满了这个立方体。如果您能想象的出在屏幕的深度方向,应该在设计新3D对象时没有任何问题。 By the end of this tutorial, you should have a better understanding of how objects are created in 3D space. You have to think of the OpenGL screen as a giant piece of graph paper, with many transparent layers behind it. Almost like a giant cube made of of points. Some of the points move left to right, some move up and down, and some move further back in the cube. If you can visualize the depth into the screen, you shouldn't have any problems designing new 3D objects. 

     

    int DrawGLScene(GLvoid)// 从这里开始进行所有的绘制 { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕和深度缓存 glLoadIdentity();// 重置当前的模型观察矩阵 /*******************************************************/ // 增加新的物体 // // [1] 三角形 -> 四棱锥 glTranslatef(-1.5f, 0.0f, -6.0f);// 左移1.5单位,并移入屏幕6.0 glRotatef(rtri, 0.0f, 1.0f, 0.0f);// 绕Y轴旋转三角形 glBegin(GL_TRIANGLES);// 绘制三角形 /* 前侧面 */ glColor3f(1.0f, 0.0f, 0.0f); // 红色 glVertex3f(0.0f, 1.0f, 0.0f); // 上顶点 glColor3f(0.0f, 1.0f, 0.0f); // 绿色 glVertex3f(-1.0f,-1.0f, 1.0f); // 左下 glColor3f(0.0f, 0.0f, 1.0f); // 蓝色 glVertex3f(1.0f, -1.0f, 1.0f); // 右下 /* 右侧面 */ glColor3f(1.0f, 0.0f, 0.0f); // 红色 glVertex3f(0.0f, 1.0f, 0.0f); // 三角形的上顶点 glColor3f(0.0f, 0.0f, 1.0f); // 蓝色 glVertex3f(1.0f, -1.0f, 1.0f); // 三角形的左下顶点 glColor3f(0.0f, 1.0f, 0.0f); // 绿色 glVertex3f(1.0f, -1.0f, -1.0f); // 三角形的右下顶点 /* 后侧面 */ glColor3f(1.0f, 0.0f, 0.0f); // 红色 glVertex3f(0.0f, 1.0f, 0.0f); // 三角形的上顶点 glColor3f(0.0f, 1.0f, 0.0f); // 绿色 glVertex3f(1.0f, -1.0f, -1.0f); // 三角形的左下顶点 glColor3f(0.0f, 0.0f, 1.0f); // 蓝色 glVertex3f(-1.0f, -1.0f, -1.0f);// 三角形的右下顶点 /* 左侧面 */ glColor3f(1.0f, 0.0f, 0.0f); // 红色 glVertex3f(0.0f, 1.0f, 0.0f); // 三角形的上顶点 glColor3f(0.0f, 0.0f, 1.0f); // 蓝色 glVertex3f(-1.0f, -1.0f, -1.0f);// 三角形的左下顶点 glColor3f(0.0f, 1.0f, 0.0f); // 绿色 glVertex3f(-1.0f, -1.0f, 1.0f); // 三角形的右下顶点 glEnd();// 三角形绘制结束 // // [2] 正方形 -> 立方体 glLoadIdentity();// 重置模型观察矩阵 glTranslatef(1.5f, 0.0f, -7.0f); // 右移1.5单位,并移入屏幕7.0 //glTranslatef(1.5f, 0.0f, -6.0f); // 右移1.5单位,并移入屏幕6.0 //glTranslatef(3.0f, 0.0f, 0.0f); // 右移3单位 glRotatef(rquad, 1.0f, 1.0f, 1.0f); // 在XYZ轴上旋转立方体 //glRotatef(rquad, 1.0f, 0.0f, 0.0f); // 绕X轴旋转四边形 glBegin(GL_QUADS);// 绘制正方形 // glColor3f(0.5f,0.5f,1.0f);// 一次性将当前色设置为蓝色 // glVertex3f(-1.0f, 1.0f, 0.0f);// 左上 // glVertex3f( 1.0f, 1.0f, 0.0f);// 右上 // glVertex3f( 1.0f,-1.0f, 0.0f);// 右下 // glVertex3f(-1.0f,-1.0f, 0.0f);// 左下 /* Top */ glColor3f(0.0f, 1.0f, 0.0f); // Set The Color To Green glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Top) glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Top) glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top) glVertex3f( 1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top) /* Bottom */ glColor3f(1.0f, 0.5f, 0.0f); // Set The Color To Orange glVertex3f( 1.0f,-1.0f, 1.0f); // Top Right Of The Quad (Bottom) glVertex3f(-1.0f,-1.0f, 1.0f); // Top Left Of The Quad (Bottom) glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Bottom) glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Bottom) /* Front */ glColor3f(1.0f, 0.0f, 0.0f); // Set The Color To Red glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Front) glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Front) glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Front) glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Front) /* Back */ glColor3f(1.0f, 1.0f, 0.0f); // Set The Color To Yellow glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Back) glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Back) glVertex3f(-1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Back) glVertex3f( 1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Back) /* Left */ glColor3f(0.0f, 0.0f, 1.0f); // Set The Color To Blue glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Left) glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Left) glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Left) glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Left) /* Right */ glColor3f(1.0f, 0.0f, 1.0f); // Set The Color To Violet glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Right) glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right) glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Right) glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Right) glEnd();// 正方形绘制结束 rtri+=0.2f; // 增加三角形的旋转变量 rquad-=0.15f; // 减少四边形的旋转变量 /*******************************************************/ return TRUE; }

     

    参考 : http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=05


    最新回复(0)