⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tutorial_07.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<!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 6.0" name="GENERATOR"></head><body bgcolor="#000000" text="#ffffff"><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td height="130" width="326"><img src="Tutorial_07_files/logo.png" height="130" width="326"></td>
    <td align="center" valign="middle" width="75%"><font color="#ffccaa" size="+3"><b><i>第07课</i></b></font></td>
  </tr></tbody></table>
  <!-- 上边框-->
<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%">
	<table border="0" width="100%">
          <tbody><tr>
            <td width="24%"><img src="Tutorial_07_files/lesson07.jpg" height="180" width="240"></td>
            <td width="76%"><p><font class="head">光照和键盘控制:</font></p>
              <p><font size="3">在这一课里,我们将添加光照和键盘控制,它让程序看起来更美观。</font></p></td>
          </tr>
     </tbody></table>
      </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>
  <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_07_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_07_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_07_files/tr.png" 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.png"><img src="Tutorial_07_files/l.png"></td>
    <td valign="top" width="100%">这一课我会教您如何使用三种不同的纹理滤波方式。教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的光照。这一课包含了很多内容,如果您对前面的课程有疑问的话,先回头复习一下。进入后面的代码之前,很好的理解基础知识十分重要。<br>
      我们还是在第一课的代码上加以修改。跟以前不一样的是,只要有任何大的改动,我都会写出整段代码。程序开始,我们先加上几个新的变量。</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> 
<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%">下面几行是新的。我们增加三个布尔变量。 light 变量跟踪光照是否打开。变量lp和fp用来存储'L' 
        和'F'键是否按下的状态。后面我会解释这些变量的重要性。现在,先放在一边吧。</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>BOOL	light;									<font color="#ffffaa">// 光源的开/关</font>
BOOL	lp;									<font color="#ffffaa">// L键按下了么?</font>
BOOL	fp;									<font color="#ffffaa">// F键按下了么?</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%">现在设置5个变量来控制绕x轴和y轴旋转角度的步长,以及绕x轴和y轴的旋转速度。另外还创建了一个z变量来控制进入屏幕深处的距离。</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>GLfloat	xrot;									<font color="#ffffaa">// X 旋转</font>
GLfloat	yrot;									<font color="#ffffaa">// Y 旋转</font>
GLfloat xspeed;									<font color="#ffffaa">// X 旋转速度</font>
GLfloat yspeed;									<font color="#ffffaa">// Y 旋转速度</font>

GLfloat	z=-5.0f;								<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%">接
着设置用来创建光源的数组。我们将使用两种不同的光。第一种称为环境光。环境光来自于四面八方。所有场景中的对象都处于环境光的照射中。第二种类型的光源
叫做漫射光。漫射光由特定的光源产生,并在您的场景中的对象表面上产生反射。处于漫射光直接照射下的任何对象表面都变得很亮,而几乎未被照射到的区域就显
得要暗一些。这样在我们所创建的木板箱的棱边上就会产生的很不错的阴影效果。<br>
        创建光源的过程和颜色的创建完全一致。前三个参数分别是RGB三色分量,最后一个是alpha通道参数。<br>
        因此,下面的代码我们得到的是半亮(0.5f)的白色环境光。如果没有环境光,未被漫射光照到的地方会变得十分黑暗。</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>GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; 				<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%">下一行代码我们生成最亮的漫射光。所有的参数值都取成最大值1.0f。它将照在我们木板箱的前面,看起来挺好。</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>GLfloat LightDiffuse[]= { 1.0f, 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_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%">最
后我们保存光源的位置。前三个参数和glTranslate中的一样。依次分别是XYZ轴上的位移。由于我们想要光线直接照射在木箱的正面,所以XY轴上
的位移都是0.0f。第三个值是Z轴上的位移。为了保证光线总在木箱的前面,所以我们将光源的位置朝着观察者(就是您哪。)挪出屏幕。我们通常将屏幕也就
是显示器的屏幕玻璃所处的位置称作Z轴的0.0f点。所以Z轴上的位移最后定为2.0f。假如您能够看见光源的话,它就浮在您显示器的前方。当然,如果木
箱不在显示器的屏幕玻璃后面的话,您也无法看见箱子。『译者注:我很欣赏NeHe的耐心。说真的有时我都打烦了,这么简单的事他这么废话干嘛?但如果什么
都清楚,您还会翻着这样的页面看个没完么?』<br>
        最后一个参数取为1.0f。这将告诉OpenGL这里指定的坐标就是光源的位置,以后的教程中我会多加解释。</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>GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };				 <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%">filter 变量跟踪显示时所采用的纹理类型。第一种纹理(texture 0) 使用gl_nearest(不光滑)滤波方式构建。第二种纹理 
        (texture 1) 使用gl_linear(线性滤波) 方式,离屏幕越近的图像看起来就越光滑。第三种纹理 (texture 2) 使用 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -