📄 tutorial_48.htm
字号:
<td class="bc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>void ArcBall_t::click(const Point2fT* NewPt)</pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">当拖动鼠标时,记录当前鼠标的位置,并计算出旋转的量。 </td>
<td class="r"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<p>void ArcBall_t::drag(const Point2fT* NewPt, Quat4fT* NewRot)<br>
</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">如果窗口大小改变,设置鼠标移动的范围</td>
<td class="r"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>void ArcBall_t::setBounds(GLfloat NewWidth, GLfloat NewHeight)</pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">下面是完成计算所要用到的数据结果,都是一些矩阵和向量</td>
<td class="r"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre><br>Matrix4fT Transform = { 1.0f, 0.0f, 0.0f, 0.0f,<br> 0.0f, 1.0f, 0.0f, 0.0f,<br> 0.0f, 0.0f, 1.0f, 0.0f,<br> 0.0f, 0.0f, 0.0f, 1.0f };</pre>
<p>Matrix3fT LastRot = { 1.0f, 0.0f, 0.0f, <br>
0.0f, 1.0f, 0.0f,<br>
0.0f, 0.0f, 1.0f };</p>
<p>Matrix3fT ThisRot = { 1.0f, 0.0f, 0.0f, <br>
0.0f, 1.0f, 0.0f,<br>
0.0f, 0.0f, 1.0f };</p>
<p>ArcBallT ArcBall(640.0f, 480.0f); <br>
Point2fT MousePt; <br>
bool isClicked = false; <span class="theme">// 是否点击鼠标</span><br>
bool isRClicked = false; <span class="theme">// 是否右击鼠标</span><br>
bool isDragging = false; <span class="theme">// 是否拖动</span></p>
<p></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">在上面定义的变量中,transform是我们获得的最终的变换矩阵,lastRot是上一次鼠标拖动得到的旋转矩阵,thisRot为这次鼠标拖动得到的旋转矩阵。
<p>当我们点击鼠标时,创建一个单位旋转矩阵,当我们拖动鼠标时,这个矩阵跟踪鼠标的变化。</p>
<p>为了更新鼠标的移动范围,我们在函数ReshapeGL中加入下面一行:</p>
<p> </p>
</td>
<td class="r"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>void ReshapeGL (int width, int height)<br>{<br> . . .<br> ArcBall.setBounds((GLfloat)width, (GLfloat)height); <span class="theme"> // 更新鼠标的移动范围</span><br>}</pre>
<p><span class="theme">// 处理鼠标的按键操作</span><br>
LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)<br>
{<br>
. . .<br>
case WM_MOUSEMOVE:<br>
MousePt.s.X = (GLfloat)LOWORD(lParam);<br>
MousePt.s.Y = (GLfloat)HIWORD(lParam);<br>
isClicked = (LOWORD(wParam) & MK_LBUTTON) ? true : false;<br>
isRClicked = (LOWORD(wParam) & MK_RBUTTON) ? true : false;<br>
break;</p>
<p> case WM_LBUTTONUP: isClicked = false; break;<br>
case WM_RBUTTONUP: isRClicked = false; break;<br>
case WM_LBUTTONDOWN: isClicked = true; break;<br>
case WM_RBUTTONDOWN: isRClicked = true; break;<br>
. . .<br>
}</p>
<p></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">为了随着输入更新我们的的状态,在Update函数中需要处理更新参数</td>
<td class="r"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>if (isRClicked) <span class="theme">// 如果右键按下,这重置所有的变量</span><br>{<br> Matrix3fSetIdentity(&LastRot);
Matrix3fSetIdentity(&ThisRot);
Matrix4fSetRotationFromMatrix3f(&Transform, &ThisRot);
}</pre>
<p>if (!isDragging) <span class="theme">// 如果没有拖动</span><br>
{<br>
if (isClicked) <span class="theme">// 第一次按下</span><br>
{<br>
isDragging = true; <span class="theme">// 设置拖动为变量为true</span><br>
LastRot = ThisRot; <br>
ArcBall.click(&MousePt); <br>
}<br>
}<br>
else<br>
{<br>
if (isClicked) <span class="theme">//如果按住拖动</span><br>
{<br>
Quat4fT ThisQuat;</p>
<p> ArcBall.drag(&MousePt, &ThisQuat); <span class="theme">// 更新轨迹球的变量</span><br>
Matrix3fSetRotationFromQuat4f(&ThisRot, &ThisQuat); <span class="theme">//
计算旋转量</span><br>
Matrix3fMulMatrix3f(&ThisRot, &LastRot); <br>
Matrix4fSetRotationFromMatrix3f(&Transform, &ThisRot); <br>
}<br>
else<span class="theme"> // 如果放开鼠标,设置拖动为false</span><br>
isDragging = false;<br>
}</p>
<p></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%">好了,完成了上面的内容。我们到了绘制的阶段。<br>
记住在绘制前,把我们得到的矩阵乘以当前的模型变换矩阵。</td>
<td class="r"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<pre>glPushMatrix(); <span class="theme">// 保存当前的矩阵</span><br> glMultMatrixf(Transform.M); <span class="theme">// 应用我们的变换矩阵</span></pre>
<p> glBegin(GL_TRIANGLES); <span class="theme">// 绘制模型</span><br>
. . .<br>
glEnd(); </p>
<p> glPopMatrix(); <span class="theme">// 弹出保存的矩阵</span></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="tl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="tc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="100%"></td>
<td class="tr"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="l"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="back3" valign="top" width="100%"><p>我已经在上面给掩饰了所有的技巧,你可以不使用我告诉你的数学技巧,因为我想你会有更好的。现在你已经看到了,这是多么的简单,你完全可以按你的风格创造出更好的轨迹球。</p>
<table border="1" width="100%">
<tbody><tr>
<td width="27%"><img src="Tutorial_48_files/logo%25203.jpg" align="middle" height="200" width="209"></td>
<td width="73%">版权与使用声明:<br>
我是个对学习和生活充满激情的普通男孩,在网络上我以DancingWind为昵称,我的联系方式是zhouwei02@mails.tsinghua.edu.cn,如果你有任何问题,都可以联系我。
<p>引子<br>
网络是一个共享的资源,但我在自己的学习生涯中浪费大量的时间去搜索可用的资料,在现实生活中花费了大量的金钱和时间在书店中寻找资料,于是我给自己起了
个昵称DancingWind,其意义是想风一样从各个知识的站点中吸取成长的养料。在飘荡了多年之后,我决定把自己收集的资料整理为一个统一的资源库。</p>
<p>版权声明<br>
所有DancingWind发表的内容,大多都来自共享的资源,所以我没有资格把它们据为己有,或声称自己为这些资源作出了一点贡献。故任何人都可以复
制,修改,重新发表,甚至以自己的名义发表,我都不会追究,但你在做以上事情的时候必须保证内容的完整性,给后来的人一个完整的教程。最后,任何人不能以
这些资料的任何部分,谋取任何形式的报酬。</p>
<p>发展计划<br>
在国外,很多资料都是很多人花费几年的时间慢慢积累起来的。如果任何人有兴趣与别人共享你的知识,我很欢迎你与我联系,但你必须同意我上面的声明。</p>
<p>感谢<br>
感谢我的母亲一直以来对我的支持和在生活上的照顾。<br>
感谢我深爱的女友田芹,一直以来默默的在精神上和生活中对我的支持,她甚至把买衣服的钱都用来给我买书了,她真的是我见过的最好的女孩,希望我能带给她幸福。</p>
<p>资源下载: <br>
文档 <a href="http://www.owlei.com/DancingWind/Res/mht/NeHe%20OpenGL%20Chinese%20Course%2048.mht">网页格式</a>
<a href="http://www.owlei.com/DancingWind/Res/pdf/OpenGL_Nehe_Course_Tutorial_48.pdf">PDF格式</a><br>
源码 <a href="http://www.owlei.com/DancingWind/Res/Src/48_ArcBall.rar">RAR格式</a></p></td>
</tr>
</tbody></table>
<font class="text"><table border="0" width="100%">
<tbody>
<tr>
<td align="left" width="50%"><b><font size="-1"><a href="http://www.owlei.com/DancingWind/Course/Tutorial_47.htm">< 第47课</a></font></b></td>
<td align="right" width="50%"></td>
</tr>
</tbody>
</table>
</font>
</td>
<td class="r"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="bl"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="bc" width="100%"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td>
<td class="br"><img alt="" src="Tutorial_48_files/blank1.gif" height="28" width="28"></td></tr></tbody></table>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -