📄 tutorial_07.htm
字号:
<tbody>
<tr>
<td><img src="Tutorial_07_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre> glEnable(GL_LIGHT1); <font color="#ffffaa">// 启用一号光源</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_07_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_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_07_files/l.gif"><img src="Tutorial_07_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">下一段代码绘制贴图立方体。我只对新增的代码进行注解。如果您对没有注解的代码有疑问,回头看看第六课。</td>
<td background="Tutorial_07_files/r.gif"><img src="Tutorial_07_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_07_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_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>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_07_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_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_07_files/l.gif"><img src="Tutorial_07_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">下
三行代码放置并旋转贴图立方体。glTranslatef(0.0f,0.0f,z)将立方体沿着Z轴移动Z单位。glRotatef(xrot,
1.0f,0.0f,0.0f)将立方体绕X轴旋转xrot。glRotatef(yrot,0.0f,1.0f,0.0f)将立方体绕Y轴旋转
yrot。</td>
<td background="Tutorial_07_files/r.gif"><img src="Tutorial_07_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_07_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre> glTranslatef(0.0f,0.0f,z); <font color="#ffffaa">// 移入/移出屏幕 z 个单位</font>
glRotatef(xrot,1.0f,0.0f,0.0f); <font color="#ffffaa">// 绕X轴旋转</font>
glRotatef(yrot,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_07_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_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_07_files/l.gif"><img src="Tutorial_07_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">下一行与我们在第六课中的类似。有所不同的是,这次我们绑定的纹理是texture[filter],而不是上一课中的texture[0]。任何时候,我们按下F键,filter
的值就会增加。如果这个数值大于2,变量filter 将被重置为0。程序初始时,变量filter 的值也将设为0。使用变量filter 我们就可以选择三种纹理中的任意一种。</td>
<td background="Tutorial_07_files/r.gif"><img src="Tutorial_07_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_07_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre> glBindTexture(GL_TEXTURE_2D, texture[filter]); <font color="#ffffaa">// 选择由filter决定的纹理</font>
glBegin(GL_QUADS); <font color="#ffffaa">// 开始绘制四边形</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_07_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_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_07_files/l.gif"><img src="Tutorial_07_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%"><p>glNormal3f
是这一课的新东西。Normal就是法线的意思,所谓法线是指经过面(多边形)上的一点且垂直于这个面(多边形)的直线。使用光源的时候必须指定一条法
线。法线告诉OpenGL这个多边形的朝向,并指明多边形的正面和背面。如果没有指定法线,什么怪事情都可能发生:不该照亮的面被照亮了,多边形的背面也
被照亮....。对了,法线应该指向多边形的外侧。 </p>
<p>看着木箱的前面您会注意到法线与Z轴正向同向。这意味着法线正指向观察者-您自己。这正是我们所
希望的。对于木箱的背面,也正如我们所要的,法线背对着观察者。如果立方体沿着X或Y轴转个180度的话,前侧面的法线仍然朝着观察者,背面的法线也还是
背对着观察者。换句话说,不管是哪个面,只要它朝着观察者这个面的法线就指向观察者。由于光源紧邻观察者,任何时候法线对着观察者时,这个面就会被照亮。
并且法线越朝着光源,就显得越亮一些。如果您把观察点放到立方体内部,你就会法线里面一片漆黑。因为法线是向外指的。如果立方体内部没有光源的话,当然是
一片漆黑。<br>
</p></td>
<td background="Tutorial_07_files/r.gif"><img src="Tutorial_07_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_07_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3"> <font color="#ffffaa">// 前侧面</font>
glNormal3f( 0.0f, 0.0f, 1.0f); <font color="#ffffaa">// 法线指向观察者</font>
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
<font color="#ffffaa">// 后侧面</font>
glNormal3f( 0.0f, 0.0f,-1.0f); <font color="#ffffaa">// 法线背向观察者</font>
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
<font color="#ffffaa">// 顶面</font>
glNormal3f( 0.0f, 1.0f, 0.0f); <font color="#ffffaa">// 法线向上</font>
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
<font color="#ffffaa">// 底面</font>
glNormal3f( 0.0f,-1.0f, 0.0f); <font color="#ffffaa">// 法线朝下</font>
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
<font color="#ffffaa">// 右侧面</font>
glNormal3f( 1.0f, 0.0f, 0.0f); <font color="#ffffaa">// 法线朝右</font>
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
<font color="#ffffaa">// 左侧面</font>
glNormal3f(-1.0f, 0.0f, 0.0f); <font color="#ffffaa">// 法线朝左</font>
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd(); <font color="#ffffaa">// 四边形绘制结束</font>
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_07_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_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_07_files/l.gif"><img src="Tutorial_07_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">下两行代码将xot和yrot的旋转值分别增加xspeed和yspeed个单位。xspeed和yspeed的值越大,立方体转得就越快。</td>
<td background="Tutorial_07_files/r.gif"><img src="Tutorial_07_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_07_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre> xrot+=xspeed; <font color="#ffffaa">// xrot 增加 xspeed 单位</font>
yrot+=yspeed; <font color="#ffffaa">// yrot 增加 yspeed 单位</font>
return TRUE;
}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_07_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_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_07_files/l.gif"><img src="Tutorial_07_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">现在转入WinMain()主函数。我们将在这里增加开关光源、旋转木箱、切换过滤方式以及将木箱移近移远的控制代码。在接近WinMain()函数结束的地方你会看到SwapBuffers(hDC)这行代码。然后就在这一行后面添加如下的代码。<br>
代码将检查L键是否按下过。如果L键已按下,但lp的值不是false的话,意味着L键还没有松开,这时什么都不会发生。</td>
<td background="Tutorial_07_files/r.gif"><img src="Tutorial_07_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_07_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_07_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_07_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3"> SwapBuffers(hDC); <font color="#ffffaa">// 交换缓存</font>
if (keys['L'] && !lp) <font color="#ffffaa">// L 键已按下并且松开了?</font>
{
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_07_files/tl.jpg" height="28" width="28"></td>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -