📄 tutorial_04.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_04_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>第04课</i></b></font></div></td>
</tr>
</tbody>
</table>
<!-- 上边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_04_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_04_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_04_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_04_files/l.gif"><img src="Tutorial_04_files/l.gif" height="28" width="28"></td>
<!-- 中部文字部分-->
<td valign="top" width="100%">
<table border="0" width="100%">
<tbody><tr>
<td width="24%"><img src="Tutorial_04_files/lesson04.jpg" height="180" width="240"></td>
<td width="76%"><p><font class="head">旋转:</font></p>
<p><font size="3">在这一课里,我将教会你如何旋转三角形和四边形。左图中的三角形沿Y轴旋转,四边形沿着X轴旋转。</font></p></td>
</tr>
</tbody></table>
</td>
<!-- 中部右边框-->
<td background="Tutorial_04_files/r.gif"><img src="Tutorial_04_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_04_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_04_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_04_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_04_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_04_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_04_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_04_files/l.gif"><img src="Tutorial_04_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">上一课中我教给您三角形和四边形的着色。这一课我将教您如何将这些彩色对象绕着坐标轴旋转。<br>
其实只需在上节课的代码上增加几行就可以了。下面我将整个例程重写一遍。方便您知道增加了什么,修改了什么。<br>
我们增加两个变量来控制这两个对象的旋转。这两个变量加在程序的开始处其他变量的后面( bool
fullscreen=TRUE;下面的两行)。它们是浮点类型的变量,使得我们能够非常精确地旋转对象。浮点数包含小数位置,这意味着我们无需使用1、
2、3...的角度。你会发现浮点数是OpenGL编程的基础。新变量中叫做 rtri 的用来旋转三角形, rquad 旋转四边形。</td>
<td background="Tutorial_04_files/r.gif"><img src="Tutorial_04_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_04_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_04_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_04_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3">GLfloat rtri; <font color="#ffffaa">// 用于三角形的角度</font>
GLfloat rquad; <font color="#ffffaa">// 用于四边形的角度</font>
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_04_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_04_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_04_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_04_files/l.gif"><img src="Tutorial_04_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">接着我们修改DrawGLScene()的代码。<br>
下面这段代码与上一课的相同。</td>
<td background="Tutorial_04_files/r.gif"><img src="Tutorial_04_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_04_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_04_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_04_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>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_04_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_04_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_04_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_04_files/l.gif"><img src="Tutorial_04_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">下
一行代码是新的。glRotatef(Angle,Xvector,Yvector,Zvector)负责让对象绕某个轴旋转。这个命令有很多用处。
Angle 通常是个变量代表对象转过的角度。 Xvector , Yvector 和 Zvector
三个参数则共同决定旋转轴的方向。比如(1,0,0)所描述的矢量经过X坐标轴的1个单位处并且方向向右。(-1,0,0)所描述的矢量经过X坐标轴的1
个单位处,但方向向左。<br>
D. Michael Traub:提供了对 Xvector , Yvector 和 Zvector 的上述解释。<br>
为了更好的理解X, Y 和 Z的旋转,我举些例子...
<p>X
轴-您正在使用一台台锯。锯片中心的轴从左至右摆放(就像OpenGL中的X轴)。尖利的锯齿绕着X轴狂转,看起来要么向上转,要么向下转。取决于锯片开
始转时的方向。这与我们在OpenGL中绕着X轴旋转什么的情形是一样的。(译者注:这会儿您要把脸蛋凑向显示器的话,保准被锯开了花 ^-^。)</p>
<p>Y轴-假设您正处于一个巨大的龙卷风中心,龙卷风的中心从地面指向天空(就像OpenGL中的Y轴)。垃圾和碎片围着Y轴从左向右或是从右向左狂转不止。这与我们在OpenGL中绕着Y轴旋转什么的情形是一样的。</p>
<p>Z轴-您从正前方看着一台风扇。风扇的中心正好朝着您(就像OpenGL中的Z轴)。风扇的叶片绕着Z轴顺时针或逆时针狂转。这与我们在OpenGL中绕着Z轴旋转什么的情形是一样的。</p>
<p>下面的一行代码中,如果rtri等于7,我们将三角形绕着Y轴从左向右旋转7 。您也可以改变参数的值,让三角形绕着X和Y轴同时旋转。</p></td>
<td background="Tutorial_04_files/r.gif"><img src="Tutorial_04_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_04_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_04_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_04_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre> glRotatef(rtri,0.0f,1.0f,0.0f); <font color="#ffffaa">// 绕Y轴旋转三角形</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_04_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_04_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_04_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_04_files/l.gif"><img src="Tutorial_04_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">下面的代码没有变化。在屏幕的左面画了一个彩色渐变三角形,并绕着Y轴从左向右旋转。</td>
<td background="Tutorial_04_files/r.gif"><img src="Tutorial_04_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_04_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_04_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_04_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -