📄 tutorial_35.htm
字号:
<font color="#ffffaa">// 正面</font>
glTexCoord2f(1.0f, 1.0f); glVertex3f( 11.0f, 8.3f, -20.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-11.0f, 8.3f, -20.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-11.0f, -8.3f, -20.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 11.0f, -8.3f, -20.0f);
glEnd();
}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_35_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_35_files/l.png"><img src="Tutorial_35_files/l.png"></td>
<td valign="top" width="100%">画完背景(或没有),重设模型视角矩阵(使视角中心回到屏幕中央).视角中心再向屏内移进10个单位.然后检查env是否为TRUE.若是,开启球面映射来实现环境映射效果.<br></td><td background="Tutorial_35_files/r.png"><img src="Tutorial_35_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_35_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> glLoadIdentity (); <font color="#ffffaa">// 重设模型视角矩阵</font>
glTranslatef (0.0f, 0.0f, -10.0f); <font color="#ffffaa">// 视角中心再向屏内移进10个单位</font>
if (env) <font color="#ffffaa">// 环境映射开启?</font>
{
glEnable(GL_TEXTURE_GEN_S); <font color="#ffffaa">// 开启纹理坐标生成S坐标</font>
glEnable(GL_TEXTURE_GEN_T); <font color="#ffffaa">// 开启纹理坐标生成T坐标</font>
}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_35_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_35_files/l.png"><img src="Tutorial_35_files/l.png"></td>
<td valign="top" width="100%">在最后关头我加了以下代码.他绕X轴和Y轴旋转(根据angle的值)然后在Z轴方向移动2单位.这使我们离开了屏幕中心.如果删掉下面三行,对象会在屏幕中心打转.有了下面三行,对象旋转时看起来离我们远一些:)
<p>如果你不懂旋转和平移...你就不该读这一章:)<br>
</p></td><td background="Tutorial_35_files/r.png"><img src="Tutorial_35_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_35_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> glRotatef(angle*2.3f,1.0f,0.0f,0.0f); <font color="#ffffaa">// 加旋转让东西动起来</font>
glRotatef(angle*1.8f,0.0f,1.0f,0.0f); <font color="#ffffaa">// 加旋转让东西动起来</font>
glTranslatef(0.0f,0.0f,2.0f); <font color="#ffffaa">// 旋转后平移到新位置</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_35_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_35_files/l.png"><img src="Tutorial_35_files/l.png"></td>
<td valign="top" width="100%">下面的代码检查我们要画哪一个对象.若effect为0,我们做一些旋转在画一个立方体.这个旋转使立方体绕X,Y,Z轴旋转.现在你脑中该烙下建一个立方体的方法了吧:)</td>
<td background="Tutorial_35_files/r.png"><img src="Tutorial_35_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_35_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> switch (effect) <font color="#ffffaa">// 哪个效果?</font>
{
case 0: <font color="#ffffaa">// 效果 0 - 立方体</font>
glRotatef (angle*1.3f, 1.0f, 0.0f, 0.0f);
glRotatef (angle*1.1f, 0.0f, 1.0f, 0.0f);
glRotatef (angle*1.2f, 0.0f, 0.0f, 1.0f);
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.0f, 0.5f);
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);
glNormal3f( 0.0f, 0.0f,-0.5f);
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);
glNormal3f( 0.0f, 0.5f, 0.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);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glNormal3f( 0.0f,-0.5f, 0.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);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glNormal3f( 0.5f, 0.0f, 0.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);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glNormal3f(-0.5f, 0.0f, 0.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);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
break; </pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_35_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_35_files/l.png"><img src="Tutorial_35_files/l.png"></td>
<td valign="top" width="100%">下
面是画球体的地方.开始先绕X,Y,Z轴旋转,再画球体.球体半径为1.3f,20经线,20纬线.我用20是因为我没打算让球体非常光滑.少用些经纬
数,使球看起来不那么光滑,这样球转起来时就能看到球面映射的效果(当然球面映射必须开启).试着尝试其它值!要知道,使用更多的经纬数需要更强的计算能
力!</td>
<td background="Tutorial_35_files/r.png"><img src="Tutorial_35_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_35_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> case 1: <font color="#ffffaa">// 效果1,球体</font>
glRotatef (angle*1.3f, 1.0f, 0.0f, 0.0f);
glRotatef (angle*1.1f, 0.0f, 1.0f, 0.0f);
glRotatef (angle*1.2f, 0.0f, 0.0f, 1.0f);
gluSphere(quadratic,1.3f,20,20);
break; </pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_35_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_35_files/l.png"><img src="Tutorial_35_files/l.png"></td>
<td valign="top" width="100%">下面画圆柱.开始先绕X,Y,Z轴旋转,圆柱顶和底的半径都为1.0f.高3.0f,32经线,32纬线.若减少经纬数,圆柱的组成多边形会减少,他看起来就没那么圆.</td>
<td background="Tutorial_35_files/r.png"><img src="Tutorial_35_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_35_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> case 2: <font color="#ffffaa">// 效果2,圆柱</font>
glRotatef (angle*1.3f, 1.0f, 0.0f, 0.0f);
glRotatef (angle*1.1f, 0.0f, 1.0f, 0.0f);
glRotatef (angle*1.2f, 0.0f, 0.0f, 1.0f);
glTranslatef(0.0f,0.0f,-1.5f);
gluCylinder(quadratic,1.0f,1.0f,3.0f,32,32);
break;
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_35_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_35_files/l.png"><img src="Tutorial_35_files/l.png"></td>
<td valign="top" width="100%">下面检查env是否为TRUE,若是,关闭球面映射.调用glFlush()清空渲染流水线(使在下一帧开始前一切都渲染了).</td>
<td background="Tutorial_35_files/r.png"><img src="Tutorial_35_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_35_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> if (env) <font color="#ffffaa">// 是否开启了环境渲染</font>
{
glDisable(GL_TEXTURE_GEN_S); <font color="#ffffaa">// 关闭纹理坐标S</font>
glDisable(GL_TEXTURE_GEN_T); <font color="#ffffaa">// 关闭纹理坐标T</font>
}
glFlush (); <font color="#ffffaa">// 清空渲染流水线</font>
}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_35_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_35_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_35_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_35_files/l.png"><img src="Tutorial_35_files/l.png"></td>
<td valign="top" width="100%"><font face="Tahoma,Verdana,sans-serif" size="-1">希</font>望
你们喜欢这一章.现在已经凌晨两点了(译者oak:译到这时刚好也是2:00am!)...写这章花了我6小时了.听起来不可思议,可要把东西写通不是件
容易的事.本文我读了三边,我力图使文章好懂.不管你信还是不信,对我最重要的是你们能明白代码是怎样运作的,它为什么能行.那就是我喋喋不休并且加了过
量注解的原因. <p>无论如何,我都想听到本文的反馈.如果你找到文章的错误,并想帮我做一些改进,请联系我.就像我说的那样,这是我第一次写和AVI有关的代码.通常我不会写一个我才接触到的主题,但我太兴奋了,并且考虑到关于这方面的文章太少了.我所希望的是,我打开了编写高质量AVI
demo和代码的一扇门!也许成功,也许没有.不管怎样,你可以任意处理我的代码.</p>
<p>非常感谢 Fredster提供face AVI文件.Face是他发来的六个AVI动画中的一个.他没提出任何问题和条件.他以
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -