📄 tutorial_35.htm
字号:
quadratic=gluNewQuadric(); <font color="#ffffaa">// 建二次曲面的指针</font>
gluQuadricNormals(quadratic, GLU_SMOOTH); <font color="#ffffaa">// 设置光滑的法线</font>
gluQuadricTexture(quadratic, GL_TRUE); <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%">下面的代码中,我们开启2D纹理映射,纹理滤镜设为GLNEAREST(最快,但看起来很糙),建立球面映射(为了实现环境映射效果).试试其它滤镜,如果你有条件,可以试试GLLINEAR得到一个平滑的动画效果.
<p>设完纹理和球面映射,我们打开.AVI文件.我尽量使事情简单化...你能看出来么:)我们要打开的文件叫作facec2.avi<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> glEnable(GL_TEXTURE_2D); <font color="#ffffaa">// 开启2D纹理映射</font>
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);<font color="#ffffaa">// 设置纹理滤镜</font>
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); <font color="#ffffaa">// 设纹理坐标生成模式为s</font>
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); <font color="#ffffaa">// 设纹理坐标生成模式为t</font>
OpenAVI("data/face2.avi"); <font color="#ffffaa">// 打开AVI文件</font>
<font color="#ffffaa">// 创建纹理</font>
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
return TRUE; <font color="#ffffaa">// 初始化成功返回TRUE</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%">关闭时调用CloseAVI().他正确的关闭AVI文件,并释放所有占用资源.</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>void Deinitialize (void) <font color="#ffffaa">// 做所有的释放工作</font>
{
CloseAVI(); <font color="#ffffaa">// 关闭AVI文件</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值.有3种效果(立方,球,圆柱)第四个效果被选时(effect
= 3)不画任何对象...仅显示背景!如果选了第四效果,空格又按下了,就重设为第一个效果(effect = 0).Yeah,我本该叫他对象:)
<p>然后检查’b’键是否按下,若是,则改变背景(bg从ON到OFF或从OFF到ON).</p>
<p>环境映射的键设置也一样.检查’E’是否按下,若是则改变env从TRUE到FALSE或从FALSE到TRUE.仅仅是关闭或开启环境映射!</p>
<p>每次调用Updata()时angle都加上一个小分数.我用经过的时间除以60.0f使速度降一点.<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>void Update (DWORD milliseconds) <font color="#ffffaa">// 动画更新</font>
{
if (g_keys->keyDown [VK_ESCAPE] == TRUE) <font color="#ffffaa">//ESC按下?</font>
{
TerminateApplication (g_window); <font color="#ffffaa">// 关闭程序</font>
}
if (g_keys->keyDown [VK_F1] == TRUE) <font color="#ffffaa">// F1按下?</font>
{
ToggleFullscreen (g_window); <font color="#ffffaa">// 改变显示模式</font>
}
if ((g_keys->keyDown [' ']) && !sp) <font color="#ffffaa">// 空格按下并已松开</font>
{
sp=TRUE; <font color="#ffffaa">// 设sp为True</font>
effect++; <font color="#ffffaa">// 增加effect</font>
if (effect>3) <font color="#ffffaa">// 超出界限?</font>
effect=0; <font color="#ffffaa">// 重设为0</font>
}
if (!g_keys->keyDown[' ']) <font color="#ffffaa">// 空格没按下?</font>
sp=FALSE; <font color="#ffffaa">// 设sp为False</font>
if ((g_keys->keyDown ['B']) && !bp) <font color="#ffffaa">// ’B’按下并已松开</font>
{
bp=TRUE; <font color="#ffffaa">// 设bp为True</font>
bg=!bg; <font color="#ffffaa">// 改变背景 Off/On</font>
}
if (!g_keys->keyDown['B']) <font color="#ffffaa">// ’B’没按下?</font>
bp=FALSE; <font color="#ffffaa">// 设bp为False</font>
if ((g_keys->keyDown ['E']) && !ep) <font color="#ffffaa">// ’E’按下并已松开</font>
{
ep=TRUE; <font color="#ffffaa">// 设ep为True</font>
env=!env; <font color="#ffffaa">// 改变环境映射 Off/On</font>
}
if (!g_keys->keyDown['E']) <font color="#ffffaa">//’E’没按下</font>
ep=FALSE; <font color="#ffffaa">// 设ep为False</font>
angle += (float)(milliseconds) / 60.0f; <font color="#ffffaa">// 根据时间更新angle</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%">在原来的文章里,所有的AVI文件都以相同的速度播放.于是,我重写了本文让视频以正常的速度播放.next增加经过的毫秒数.如果你记得文章的前面,我们算出了显示每帧的毫秒数(mpf).为了计算当前帧,我们拿经过的时间除以显示每帧的毫秒数(mpf).
<p>还要检查确定当前帧没有超过视频的最后帧.若超过了,则将frame设为0,动画计时器设为0,于是动画从头开始.</p>
<p>下面的代码会丢掉一些帧,若果你的计算机太慢的话,<br>
或者另一个程序占用了CPU.如果想显示每一帧而不管计算机有多慢的话,你要检查next是否比mpf大,若是,你要把next设为0,frame增1.两种方法都行,虽然下面的代码更有利于跑的快的机器.</p>
<p>如果你有干劲,试着加上循环,快速播放,暂停或倒放等功能.</p>
<p></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">
</font><pre><font color="#aaffaa" size="3"> next+= milliseconds; <font color="#ffffaa">// 根据时间增加next</font>
frame=next/mpf; <font color="#ffffaa">// 计算当前帧号</font>
if (frame>=lastframe) <font color="#ffffaa">// 超过最后一帧?</font>
{
frame=0; <font color="#ffffaa">// Frame设为0</font>
next=0; <font color="#ffffaa">// 重设动画计时器</font>
}
}
</font></pre>
<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%">下面是画屏代码:)我们清屏和深度缓冲.再抓取动画的一帧.我将使这更简单!把你想要的帧数传给GrabAVIFrame().非常简单!当然,如果是多个AVI,你要传一个纹理标号.(你要做更多的事)</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>void Draw (void) <font color="#ffffaa">// 绘制我们的屏幕</font>
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); <font color="#ffffaa">// 清屏和深度缓冲</font>
GrabAVIFrame(frame); <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%">下面检查我们是否想画一个背景图.若bg是TRUE,重设模型视角矩阵,画一个单纹理映射的能盖住整个屏幕的矩形(纹理是从AVI从得到的一帧).矩形距离屏面向里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> if (bg) <font color="#ffffaa">// 背景可见?</font>
{
glLoadIdentity(); <font color="#ffffaa">// 重设模型视角矩阵</font>
glBegin(GL_QUADS); <font color="#ffffaa">// 开始画背景(一个矩形)</font>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -