📄 tutorial_05.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><!-- 这篇文章由Dancingwind翻译,作者的联系方式zhouwei02@mails.tsinghua.edu.cn --><title>NeHe OpenGL教程第五课,DancingWind翻译</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">A:link {
COLOR: #ccaaff; TEXT-DECORATION: none
}
A:visited {
COLOR: #ccaaff; TEXT-DECORATION: none
}
A:active {
COLOR: #ccaaff; TEXT-DECORATION: none
}
A:hover {
COLOR: #ffccaa; TEXT-DECORATION: none
}
</style>
<meta content="Microsoft FrontPage 3.0" name="GENERATOR"></head><body bgcolor="#000000" text="#ffffff">
<center><br>
<p><br>
</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td height="130" width="326"><img src="Tutorial_05_files/logo.png" height="130" width="326"></td>
<td align="center" valign="center" width="75%"><div align="center"><font color="#ffccaa" size="+3"><b><i>第05课</i></b></font></div></td>
</tr>
</tbody>
</table>
<!-- 上边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_05_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_05_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_05_files/tr.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<!-- 中部-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<!-- 中部左边框-->
<td background="Tutorial_05_files/l.gif"><img src="Tutorial_05_files/l.gif" height="28" width="28"></td>
<!-- 中部文字部分-->
<td valign="top" width="100%">
<table border="0" width="100%">
<tbody><tr>
<td width="26%"><img src="Tutorial_05_files/lesson05.jpg" height="180" width="240"></td>
<td width="74%"><p><font class="head">3D空间:</font></p>
<p><font size="3">我们使用多边形和四边形创建3D物体,在这一课里,我们把三角形变为立体的金子塔形状,把四边形变为立方体。</font></p></td>
</tr>
</tbody></table>
</td>
<!-- 中部右边框-->
<td background="Tutorial_05_files/r.gif"><img src="Tutorial_05_files/r.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<!-- 下边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_05_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_05_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_05_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_05_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_05_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_05_files/tr.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td background="Tutorial_05_files/l.gif"><img src="Tutorial_05_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">在上节课的内容上作些扩展,我们现在开始生成真正的3D对象,而不是象前两节课中那样3D世界中的2D对象。我们给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔(四棱锥)。给正方形增加左、右、上、下及背面生成一个立方体。
<p>我们混合金字塔上的颜色,创建一个平滑着色的对象。给立方体的每一面则来个不同的颜色。</p></td>
<td background="Tutorial_05_files/r.gif"><img src="Tutorial_05_files/r.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_05_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_05_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_05_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre>int DrawGLScene(GLvoid) <font color="#ffffaa">// 此过程中包括所有的绘制代码</font>
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); <font color="#ffffaa">// 清除屏幕及深度缓存</font>
glLoadIdentity(); <font color="#ffffaa">// 重置模型观察矩阵</font>
glTranslatef(-1.5f,0.0f,-6.0f); <font color="#ffffaa">// 左移 1.5 单位,并移入屏幕 6.0</font>
glRotatef(rtri,0.0f,1.0f,0.0f); <font color="#ffffaa">// 绕Y轴旋转金字塔</font>
glBegin(GL_TRIANGLES); <font color="#ffffaa">// 开始绘制金字塔的各个面</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_05_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_05_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_05_files/tr.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td background="Tutorial_05_files/l.gif"><img src="Tutorial_05_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">有些人可能早已在上节课中的代码上尝试自行创建3D对象了。但经常有人来信问我:"我的对象怎么不会绕着其自身的轴旋转?看起来总是在满屏乱转。"要让您的对象绕自身的轴旋转,您必须让对象的中心坐标总是(0.0f,0,0f,0,0f)。<br>
下面的代码创建一个绕者其中心轴旋转的金字塔。金字塔的上顶点高出原点一个单位,底面中心低于原点一个单位。上顶点在底面的投影位于底面的中心。
<p>注意所有的面-三角形都是逆时针次序绘制的。这点十分重要,在以后的课程中我会作出解释。现在,您只需明白要么都逆时针,要么都顺时针,但永远不要将两种次序混在一起,除非您有足够的理由必须这么做。</p>
<p>我
们开始画金字塔的前侧面。因为所有的面都共享上顶点,我们将这点在所有的三角形中都设置为红色。底边上的两个顶点的颜色则是互斥的。前侧面的左下顶点是绿
色的,右下顶点是蓝色的。这样相邻右侧面的左下顶点是蓝色的,右下顶点是绿色的。这样四边形的底面上的点的颜色都是间隔排列的。</p></td>
<td background="Tutorial_05_files/r.gif"><img src="Tutorial_05_files/r.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_05_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_05_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_05_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre> glColor3f(1.0f,0.0f,0.0f); <font color="#ffffaa">// 红色</font>
glVertex3f( 0.0f, 1.0f, 0.0f); <font color="#ffffaa">// 三角形的上顶点 (前侧面)</font>
glColor3f(0.0f,1.0f,0.0f); <font color="#ffffaa">// 绿色</font>
glVertex3f(-1.0f,-1.0f, 1.0f); <font color="#ffffaa">// 三角形的左下顶点 (前侧面)</font>
glColor3f(0.0f,0.0f,1.0f); <font color="#ffffaa">// 蓝色</font>
glVertex3f( 1.0f,-1.0f, 1.0f); <font color="#ffffaa">// 三角形的右下顶点 (前侧面)</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_05_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_05_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_05_files/tr.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td background="Tutorial_05_files/l.gif"><img src="Tutorial_05_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">现在绘制右侧面。注意其底边上的两个顶点的X坐标位于中心右侧的一个单位处。顶点则位于Y轴上的一单位处,且Z坐标正好处于底边的两顶点的Z坐标中心。右侧面从上顶点开始向外侧倾斜至底边上。<br>
这次的左下顶点用蓝色绘制,以保持与前侧面的右下顶点的一致。蓝色将从这个角向金字塔的前侧面和右侧面扩展并与其他颜色混合。<br>
还应注意到后面的三个侧面和前侧面处于同一个glBegin(GL_TRIANGLES) 和
glEnd()语句中间。因为我们是通过三角形来构造这个金字塔的。OpenGL知道每三个点构成一个三角形。当它画完一个三角形之后,如果还有余下的点
出现,它就以为新的三角形要开始绘制了。OpenGL在这里并不会将四点画成一个四边形,而是假定新的三角形开始了。所以千万不要无意中增加任何多余的
点。</td>
<td background="Tutorial_05_files/r.gif"><img src="Tutorial_05_files/r.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_05_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_05_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_05_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3"> glColor3f(1.0f,0.0f,0.0f); <font color="#ffffaa">// 红色</font>
glVertex3f( 0.0f, 1.0f, 0.0f); <font color="#ffffaa">// 三角形的上顶点 (右侧面)</font>
glColor3f(0.0f,0.0f,1.0f); <font color="#ffffaa">// 蓝色</font>
glVertex3f( 1.0f,-1.0f, 1.0f); <font color="#ffffaa">// 三角形的左下顶点 (右侧面)</font>
glColor3f(0.0f,1.0f,0.0f); <font color="#ffffaa">// 绿色</font>
glVertex3f( 1.0f,-1.0f, -1.0f); <font color="#ffffaa">// 三角形的右下顶点 (右侧面)</font>
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -