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

📄 tutorial_09.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<!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></head><body bgcolor="#000000" text="#ffffff"><br><br>

<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td height="130" width="326"><img src="Tutorial_09_files/logo.png" height="130" width="326"></td>
    <td align="center" valign="middle" width="75%"><font color="#ffccaa" size="+3"><b><i>第09课</i></b></font></td>
  </tr></tbody></table>
  <!-- 上边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_09_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_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_09_files/l.gif"><img src="Tutorial_09_files/l.gif" height="28" width="28"></td>
	<!-- 中部文字部分-->
    <td valign="top" width="100%">
	<table border="0" width="100%">
          <tbody><tr>
            <td width="25%"><img src="Tutorial_09_files/lesson09.jpg" height="180" width="240"></td>
            <td width="75%"><p><font class="head">3D空间中移动图像:</font></p>
              <p><font size="3">你
想知道如何在3D空间中移动物体,你想知道如何在屏幕上绘制一个图像,而让图像的背景色变为透明,你希望有一个简单的动画。这一课将教会你所有的一切。前
面的课程涵盖了基础的OpenGL,每一课都是在前一课的基础上创建的。这一课是前面几课知识的综合,当你学习这课时,请确保你已经掌握了前面几课的知
识。</font></p></td>
          </tr>
     </tbody></table>
      </td>
	<!-- 中部右边框-->
    <td background="Tutorial_09_files/r.gif"><img src="Tutorial_09_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_09_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_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_09_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_09_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_09_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_09_files/l.png"><img src="Tutorial_09_files/l.png"></td>
    <td valign="top" width="100%">欢
迎进入第九课。到现在为止,您应该很好的理解OpenGL了。『CKER:如果没有的话,一定是我翻译的罪过......』。您已经学会了设置一个
OpenGL窗口的每个细节。学会在旋转的物体上贴图并打上光线以及混色(透明)处理。这一课应该算是第一课中级教程。您将学到如下的知识:在3D场景中
移动位图,并去除位图上的黑色象素(使用混色)。接着为黑白纹理上色,最后您将学会创建丰富的色彩,并把上过不同色彩的纹理相互混合,得到简单的动画效
果。<br>
      我们在第一课的代码基础上进行修改。先在程序源码的开始处增加几个变量。出于清晰起见,我重写了整段代码。</td>
    <td background="Tutorial_09_files/r.gif"><img src="Tutorial_09_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_09_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
<font color="#aaffaa" size="3"> 
<pre>#include	&lt;stdio.h&gt;					<font color="#ffffaa">// 标准输入输出库头文件</font>
#include	&lt;glaux.h&gt;					<font color="#ffffaa">// GLaux库的头文件</font>
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_09_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_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_09_files/l.gif"><img src="Tutorial_09_files/l.gif" height="28" width="28"></td>
      <td valign="top" width="100%">下列这几行新加的。twinkle和 tp是布尔变量, 表示它们只能设为 TRUE 或 FALSE。 
        twinkle用来跟踪 闪烁 效果是否启用。 tp用来检查 'T'键有没有被按下或松开. (按下时 tp=TRUE, 松开时 tp=FALSE).</td>
    <td background="Tutorial_09_files/r.gif"><img src="Tutorial_09_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_09_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
<font color="#aaffaa" size="3"> 
<pre>BOOL	twinkle;						<font color="#ffffaa">// 闪烁的星星</font>
BOOL	tp;							<font color="#ffffaa">// 'T' 按下了么?</font><font color="#aaffaa" size="3"> </font></pre>
</font><font color="#aaffaa" size="3"> </font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_09_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_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_09_files/l.gif"><img src="Tutorial_09_files/l.gif" height="28" width="28"></td>
      <td valign="top" width="100%">num
跟踪屏幕上所绘制的星星数。这个数字被定义为一个常量。这意味着无法在以后的代码中对其进行修改。这么做的原因是因为您无法重新定义一个数组。因此,如果
我们定义一个50颗星星的数组,然后又将num增加到51的话,就会出错『CKER:数组越界』。不过您还是可以(也只可以)在这一行上随意修改这个数
字。但是以后请您别再改动 num 的值了,除非您想看见灾难发生。</td>
    <td background="Tutorial_09_files/r.gif"><img src="Tutorial_09_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_09_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
<font color="#aaffaa" size="3"> 
<pre>const	num=50;							<font color="#ffffaa">// 绘制的星星数</font>
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_09_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_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_09_files/l.gif"><img src="Tutorial_09_files/l.gif" height="28" width="28"></td>
      <td valign="top" width="100%">现在我们来创建一个结构。 结构这词听起来有点可怕,但实际上并非如此。 一个结构使用一组简单类型的数据 
        (以及变量等)来表达较大的具有相似性的数据组合。 我们知道我们在保持对星星的跟踪。 您可以看到下面的第七行就是 stars;并且每个星星有三个整型的色彩值。第三行 
        int r,g,b设置了三个整数. 一个红色 (r), 一个绿色 (g), 以及一个蓝色 (b). 此外,每个星星离屏幕中心的距离不同, 而且可以是以屏幕中心为原点的任意360度中的一个角度。如果你看下面第四行的话, 
        会发现我们使用了一个叫做 dist的浮点数来保持对距离 的跟踪. 第五行则用一个叫做 angle的浮点数保持对星星角度值的跟踪。<br>
        因此我们使用了一组数据来描述屏幕上星星的色彩, 距离, 和角度。 不幸的是我们不止对一个星星进行跟踪。但是无需创建 50 个红色值、 50 
        个绿色值、 50 个蓝色值、 50 个距离值 以及 50 个角度值,而只需创建一个数组star。 star数组的每个元素都是stars类型的,里面存放 
        了描述星星的所有数据。star数组在下面的第八行创建。 第八行的样子是这样的: stars star[num]。数组类型是 stars结构. 
        所数组 能存放所有stars结构的信息。 数组名字是 star. 数组大小是 [num]。 数组中存放着 stars结构的元素. 跟踪结构元素会比跟踪各自分开的变量容易的多. 
        不过这样也很笨, 因为我们竟然不能改变常量 num来增减星星 数量。<br></td>
    <td background="Tutorial_09_files/r.gif"><img src="Tutorial_09_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_09_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
<font color="#aaffaa" size="3"> 
<pre>typedef struct							<font color="#ffffaa">// 为星星创建一个结构</font>
{
	int r, g, b;						<font color="#ffffaa">// 星星的颜色</font>
	GLfloat dist;						<font color="#ffffaa">// 星星距离中心的距离</font>
	GLfloat angle;						<font color="#ffffaa">// 当前星星所处的角度</font>
}
stars;								<font color="#ffffaa">// 结构命名为stars</font>
stars star[num];						<font color="#ffffaa">// 使用 'stars' 结构生成一个包含 'num'个元素的 'star'数组</font>
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_09_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_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_09_files/l.gif"><img src="Tutorial_09_files/l.gif" height="28" width="28"></td>
      <td valign="top" width="100%">接下来我们设置几个跟踪变量:星星离观察者的距离变量(zoom),我们所见到的星星所处的角度(tilt),以及使闪烁的星星绕Z轴自转的变量spin。<br>
        loop变量用来绘制50颗星星。texture[1]用来存放一个黑白纹理。如果您需要更多的纹理的话,您应该增加texture数组的大小至您决定采用的纹理个数。</td>
    <td background="Tutorial_09_files/r.gif"><img src="Tutorial_09_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_09_files/bl.gif" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/bc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_files/br.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>
<font color="#aaffaa" size="3"> 
<pre>GLfloat	zoom=-15.0f;						<font color="#ffffaa">// 星星离观察者的距离</font>
GLfloat tilt=90.0f;						<font color="#ffffaa">// 星星的倾角</font>
GLfloat	spin;							<font color="#ffffaa">// 闪烁星星的自转</font>

GLuint	loop;							<font color="#ffffaa">// 全局 Loop 变量</font>
GLuint	texture[1];						<font color="#ffffaa">// 存放一个纹理</font>
</pre>
</font> 
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
  <tr>
    <td><img src="Tutorial_09_files/tl.jpg" height="28" width="28"></td>
    <td width="100%"><img src="Tutorial_09_files/tc.gif" height="28" width="100%"></td>
    <td><img src="Tutorial_09_files/tr.gif" height="28" width="28"></td>
  </tr>
</tbody>
</table>

⌨️ 快捷键说明

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