第五课:3D空间
3D空间:
我们使用多边形和四边形创建3D物体,在这一课里,我们把三角形变为立体的金子塔形状,把四边形变为立方体。
在上节课的内容上作些扩展,我们现在开始生成真正的3D对象,而不是象前两节课中那样3D空间中的2D对象。我们给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔(四棱锥)。给正方形增加左、右、上、下及背面生成一个立方体。
我们混合金字塔上的颜色,创建一个平滑着色的对象。给立方体的每一面则来个不同的颜色。
int DrawGLScene(GLvoid)// 此过程中包括所有的绘制代码
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕及深度缓存
glLoadIdentity();// 重置模型观察矩阵
glTranslatef(-1.5f,0.0f,-6.0f);// 左移 1.5 单位,并移入屏幕 6.0
glRotatef(rtri,0.0f,1.0f,0.0f);// 绕Y轴旋转金字塔
glBegin(GL_TRIANGLES);// 开始绘制金字塔的各个面
有些人可能早已在上节课中的代码上尝试自行创建3D对象了。但经常有人来信问我:"我的对象怎么不会绕着其自身的轴旋转?看起来总是在满屏乱转。"要让您的对象绕自身的轴旋转,您必须让对象的中心坐标总是(0.0f,0,0f,0,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);// 三角形的右下顶点 (前侧面)
现在绘制右侧面。注意其底边上的两个顶点的X坐标位于中心右侧的一个单位处。顶点则位于Y轴上的一单位处,且Z坐标正好处于底边的两顶点的Z坐标中心。右侧面从上顶点开始向外侧倾斜至底边上。
这次的左下顶点用蓝色绘制,以保持与前侧面的右下顶点的一致。蓝色将从这个角向金字塔的前侧面和右侧面扩展并与其他颜色混合。
还应注意到后面的三个侧面和前侧面处于同一个glBegin(GL_TRIANGLES) 和 glEnd()语句中间。因为我们是通过三角形来构造这个金字塔的。OpenGL知道每三个点构成一个三角形。当它画完一个三角形之后,如果还有余下的点出现,它就以为新的三角形要开始绘制了。OpenGL在这里并不会将四点画成一个四边形,而是假定新的三角形开始了。所以千万不要无意中增加任何多余的点。
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);// 三角形的右下顶点 (后侧面)
最后画左侧面。又要切换颜色。左下顶点是蓝色,与后侧面的右下顶点相同。右下顶点是蓝色,与前侧面的左下顶点相同。
到这里金字塔就画完了。因为金字塔只绕着Y轴旋转,我们永远都看不见底面,因而没有必要添加底面。如果您觉得有经验了,尝试增加底面(正方形),并将金字塔绕X轴旋转来看看您是否作对了。确保底面四个顶点的颜色与侧面的颜色相匹配。
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();// 金字塔绘制结束
接下来开始画立方体。他由六个四边形组成。所有的四边形都以逆时针次序绘制。就是说先画右上角,然后左上角、左下角、最后右下角。您也许认为画立方体的背面的时候这个次序看起来好像顺时针,但别忘了我们从立方体的背后看背面的时候,与您现在所想的正好相反。(译者注:您是从立方体的外面来观察立方体的)。
注意到这次我们将立方体移地更远离屏幕了。因为立方体的大小要比金字塔大,同样移入6个单位时,立方体看起来要大的多。这是透视的缘故。越远的对象看起来越小 :) 。
glLoadIdentity();
glTranslatef(1.5f,0.0f,-7.0f);// 先右移再移入屏幕
glRotatef(rquad,1.0f,1.0f,1.0f);// 在XYZ轴上旋转立方体
glBegin(GL_QUADS);// 开始绘制立方体
先画立方体的顶面。从中心上移一单位,注意Y坐标始终为一单位,表示这个四边形与Z轴平行。先画右上顶点,向右一单位,再屏幕向里一单位。然后左上顶点,向左一单位,再屏幕向里一单位。然后是靠近观察者的左下和右下顶点。就是屏幕往外一单位。
glColor3f(0.0f,1.0f,0.0f);// 颜色改为蓝色
glVertex3f( 1.0f, 1.0f,-1.0f);// 四边形的右上顶点 (顶面)
glVertex3f(-1.0f, 1.0f,-1.0f);// 四边形的左上顶点 (顶面)
glVertex3f(-1.0f, 1.0f, 1.0f);// 四边形的左下顶点 (顶面)
glVertex3f( 1.0f, 1.0f, 1.0f);// 四边形的右下顶点 (顶面)
底面的画法和顶面十分类似。只是Y坐标变成了-1。如果我们从立方体的下面来看立方体的话,您会注意到右上角离观察者最近,因此我们先画离观察者最近的顶点。然后是左上顶点最后才是屏幕里面的左下和右下顶点。
如果您真的不在乎绘制多边形的次序(顺时针或者逆时针)的话,您可以直接拷贝顶面的代码,将Y坐标从1改成 -1,也能够工作。但一旦您进入象纹理映射这样的领域时,忽略绘制次序会导致十分怪异的结果。
glColor3f(1.0f,0.5f,0.0f);// 颜色改成橙色
glVertex3f( 1.0f,-1.0f, 1.0f);// 四边形的右上顶点(底面)
glVertex3f(-1.0f,-1.0f, 1.0f);// 四边形的左上顶点(底面)
glVertex3f(-1.0f,-1.0f,-1.0f);// 四边形的左下顶点(底面)
glVertex3f( 1.0f,-1.0f,-1.0f);// 四边形的右下顶点(底面)
接着画立方体的前面。保持Z坐标为一单位,前面正对着我们。
glColor3f(1.0f,0.0f,0.0f);// 颜色改成红色
glVertex3f( 1.0f, 1.0f, 1.0f);// 四边形的右上顶点(前面)
glVertex3f(-1.0f, 1.0f, 1.0f);// 四边形的左上顶点(前面)
glVertex3f(-1.0f,-1.0f, 1.0f);// 四边形的左下顶点(前面)
glVertex3f( 1.0f,-1.0f, 1.0f);// 四边形的右下顶点(前面)
立方体后面的绘制方法与前面类似。只是位于屏幕的里面。注意Z坐标现在保持 -1 不变。
glColor3f(1.0f,1.0f,0.0f);// 颜色改成黄色
glVertex3f( 1.0f,-1.0f,-1.0f);// 四边形的右上顶点(后面)
glVertex3f(-1.0f,-1.0f,-1.0f);// 四边形的左上顶点(后面)
glVertex3f(-1.0f, 1.0f,-1.0f);// 四边形的左下顶点(后面)
glVertex3f( 1.0f, 1.0f,-1.0f);// 四边形的右下顶点(后面)
还剩两个面就完成了。您会注意到总有一个坐标保持不变。这一次换成了X坐标。因为我们在画左侧面。
glColor3f(0.0f,0.0f,1.0f);// 颜色改成蓝色
glVertex3f(-1.0f, 1.0f, 1.0f);// 四边形的右上顶点(左面)
glVertex3f(-1.0f, 1.0f,-1.0f);// 四边形的左上顶点(左面)
glVertex3f(-1.0f,-1.0f,-1.0f);// 四边形的左下顶点(左面)
glVertex3f(-1.0f,-1.0f, 1.0f);// 四边形的右下顶点(左面)
立方体的最后一个面了。X坐标保持为一单位。逆时针绘制。您愿意的话,留着这个面不画也可以,这样就是一个盒子:)
或者您要是有兴趣可以改变立方体所有顶点的色彩值,象金字塔那样混合颜色。您会看见一个非常漂亮的彩色立方体,各种颜色在它的各个表面流淌。
glColor3f(1.0f,0.0f,1.0f);// 颜色改成紫罗兰色
glVertex3f( 1.0f, 1.0f,-1.0f);// 四边形的右上顶点(右面)
glVertex3f( 1.0f, 1.0f, 1.0f);// 四边形的左上顶点(右面)
glVertex3f( 1.0f,-1.0f, 1.0f);// 四边形的左下顶点(右面)
glVertex3f( 1.0f,-1.0f,-1.0f);// 四边形的右下顶点(右面)
glEnd();// 立方体绘制结束
rtri+=0.2f;// 增加三角形的旋转变量
rquad-=0.15f;// 减少四边形的旋转变量
return TRUE;// 继续运行
}
原文及其个版本源代码下载:
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=05
- 大小: 2.7 KB
分享到:
相关推荐
5. **二次函数变换**:第五题涉及到抛物线的旋转,要求学生理解绕顶点旋转180°后抛物线的性质变化,即开口方向相反,得出新的解析式。 6. **概率问题**:第六题是关于概率的计算,立方体的骰子投掷,要求计算朝上...
在导数的几何意义方面,试卷中的第4题和第5题要求学生根据函数在特定点的导数值来确定切线方程,这不仅考察了学生对导数几何意义的认识,还要求学生能够将导数的概念应用到解题过程中,求出具体的数学表达式。...
而第5题通过零点存在定理来判断函数零点区间,这要求学生不仅掌握理论,更需熟练运用。 多项选择题部分进一步考察了学生对数学知识的深入理解。例如,第9题考察角的性质,涉及三角函数的基本知识。第10题通过图像与...
5. 数列的规律:题目5通过观察数列模式,推断出数字的变化趋势。 6. 函数值域:题目6求解函数的值域,需要理解函数的定义域和图像特征。 7. 逻辑推理:题目7是一个逻辑推理题,涉及到三个陈述的真假判断,通过排除...
黑龙江省讷河市拉哈一中2020-2021学年高一下学期4月月考语文试卷 Word版含答案.doc
- **考试内容**:根据标题“黑龙江省齐齐哈尔市讷河一中2020届高三数学联考试题文PDF”,可以推测此次联考主要涉及高三阶段的数学知识点,包括但不限于函数、数列、不等式、立体几何、解析几何、概率统计等内容。...
- **考试范围**:根据标题“黑龙江省齐齐哈尔市讷河一中2020届高三数学联考试题理PDF”,可以推测此次联考主要面向高三理科学生,考试内容将涵盖高中数学的所有核心知识点。 ### 高三数学核心知识点 从给定的部分...
公路桥梁隧道施工组织设计是大型土木工程项目中的关键环节,对于鸡西至讷河公路建设项目C23标段这样的工程,其施工组织设计涉及到多个重要知识点。以下将详细阐述这些内容: 1. **项目背景与目标**:鸡西至讷河公路...
《鸡西至讷河公路建设项目C23标段施工组织设计》是一份全面阐述公路建设过程中施工规划与管理的重要文档,旨在确保工程的顺利进行、质量和安全。在公路桥梁隧道施工组织设计中,涵盖了许多关键知识点,下面将逐一...
此资源为“黑龙江省齐齐哈尔市市讷河一中2020届高三英语联考试题PDF”,是一份针对高三学生的英语考试试卷,主要目的是检验学生在高三阶段对英语知识的掌握程度,为高考做好准备。试题包含了听力、阅读、写作等多个...
黑龙江省齐齐哈尔市市讷河一中2020届高三理综联考试题PDF
《英雄》音乐微案例;黑龙江省讷河市六合镇中心学校赵明丽.doc
保护青山绿水 构筑生态文明——讷河市新能源公交车全面上路运营掠影.pdf
2021届黑龙江省讷河市拉哈一中高一下学期历史3月月考试题.doc
#### 五、教学准备 - **PPT演示文稿**:包含常见农具的图片与基本信息,有助于直观展示。 - **网络资料**:收集关于农具的历史背景、发展变迁等相关资料,丰富学生的知识面。 - **长辈采访**:安排学生采访家中长辈...
第五题是考察学生对导数定义的应用,它要求学生通过导数的定义来求解函数在某一点的导数值,这是对导数概念深层次的考查。而第六题则需要学生找到一条切线的方程,并通过解方程来找出切点坐标,这要求学生具备良好的...
黑龙江省讷河市张静中学第一学期初三期中考试语文考试题及答案.doc.pdf
4. **时间副词的使用**:第五题 "Have you ever seen him before?","before" 在这里表示“之前”,常与现在完成时态连用,询问过去某一时间点或某一动作之前的情况。 5. **Why don't you...?** 结构:第六题 "Why ...
《鸡西至讷河公路建设项目C23标段——施工组织与CAD技术在道路工程中的应用》 在交通基础设施建设中,公路项目是一项至关重要的工程,对于区域经济发展和社会进步具有深远影响。本项目——“鸡西至讷河公路建设项目...