记得我第一次看Nehe教程里第9课的时候,就被他下面这段代码弄晕了:
glRotatef(tilt,1.0f,0.0f,0.0f); // Tilt The View (Using The Value In 'tilt')
glRotatef(star[loop].angle,0.0f,1.0f,0.0f); // Rotate To The Current Stars Angle
glTranslatef(star[loop].dist,0.0f,0.0f); // Move Forward On The X Plane
glRotatef(-star[loop].angle,0.0f,1.0f,0.0f); // Cancel The Current Stars Angle
glRotatef(-tilt,1.0f,0.0f,0.0f); // Cancel The Screen Tilt
现在我们来移动星星。星星开始时位于屏幕的中心。我们要做的第一件事是把场景沿Y轴旋转。如果我们旋转90度的话,X轴不再是自左至右的了,他将由里向外穿出屏幕。为了让大家更清楚些,举个例子。假想您站在房子中间。再设想您左侧的墙上写着-x,前面的墙上写着-z,右面墙上就是+x咯,您身后的墙上则是+ z。加入整个房子向右转90度,但您没有动,那么前面的墙上将是-x而不再是-z了。所有其他的墙也都跟着移动。-z出现在右侧,+z出现在左侧,+x出现在您背后。神经错乱了吧?通过旋转场景,我们改变了x和z平面的方向。
第二行代码沿x轴移动一个正值。通常x轴上的正值代表移向了屏幕的右侧(也就是通常的x轴的正向),但这里由于我们绕y轴旋转了坐标系,x轴的正向可以是任意方向。如果我们转180度的话,屏幕的左右侧就镜像反向了。因此,当我们沿 x轴正向移动时,可能向左,向右,向前或向后。
接着的代码带点小技巧。星星实际上是一个平面的纹理。现在您在屏幕中心画了个平面的四边形然后贴上纹理,这看起来很不错。一切都如您所想的那样。但是当您当您沿着y轴转上个90度的话,纹理在屏幕上就只剩右侧和左侧的两条边朝着您。看起来就是一条细线。这不是我们所想要的。我们希望星星永远正面朝着我们,而不管屏幕如何旋转或倾斜。
我们通过在绘制星星之前,抵消对星星所作的任何旋转来实现这个愿望。您可以采用逆序来抵消旋转。当我们倾斜屏幕时,我们实际上以当前角度旋转了星星。通过逆序,我们又以当前角度"反旋转"星星。也就是以当前角度的负值来旋转星星。就是说,如果我们将星星旋转了10度的话,又将其旋转-10度来使星星在那个轴上重新面对屏幕。下面的第一行抵消了沿y轴的旋转。然后,我们还需要抵消掉沿x轴的屏幕倾斜。要做到这一点,我们只需要将屏幕再旋转-tilt倾角。在抵消掉x和y轴的旋转后,星星又完全面对着我们了。
今天又复习到这一课了,还是理解不了他干嘛要旋转坐标轴,接着又逆向旋转回去,就和susu讨论了下:
//glRotatef(tilt,1.0f,0.0f,0.0f); // Tilt The View (Using The Value In 'tilt')
glRotatef(star[loop].angle,0.0f,0.0f,1.0f); // Rotate To The Current Stars Angle
glTranslatef(star[loop].dist,0.0f,0.0f); // Move Forward On The X Plane
// glRotatef(-star[loop].angle,0.0f,1.0f,0.0f); // Cancel The Current Stars Angle
// glRotatef(-tilt,1.0f,0.0f,0.0f); // Cancel The Screen Tilt
没必要抵消嘛,他把坐标轴转了个90度,我认为没必要
glRotatef(star[loop].angle,0.0f,0.0f,1.0f);
glTranslatef(star[loop].dist,0.0f,0.0f);
//glRotatef(tilt,1.0f,0.0f,0.0f);
这个坐标轴转个90度到底有啥用处吗?让四边形对着视点?
那y,z轴既然已经换了,那这句:glRotatef(star[loop].angle,0.0f,1.0f,0.0f); // 旋转至当前所画星星的角度;到底是围着哪条轴转的?
本来应该是绕y轴,可现在z轴在它的位置上,不是变绕z了?
glTranslatef(star[loop].dist,0.0f,0.0f); // 沿X轴正向移动,这里又绕x轴平移,本来x轴就没动过,所以前面做的坐标轴变换不是白搭了。。。
glTranslatef(star[loop].dist,0.0f,0.0f);是不是只做了一遍
哦,那下面还有的: star[loop].dist-=0.01f;
if (star[loop].dist<0.0f)
恩,我修改后的代码和Nehe的效果没什么区别,但没有刚才那么难理解了
我觉得他先把坐标轴绕X轴转了个90度,这不就让y,z轴互换了吗?再让四边形绕y轴(我理解这里应该是旋转后的z轴了)转自己的角度,最后平移自己到中心的距离,可最终他又反向旋转回去,真是让人晕,那这样旋转坐标轴到底有什么用处呢?不转还不是一样,我下面就修改了他的代码,根本不去转那个该死的坐标轴,好像最终效果也差不多呀:
glRotatef(star[loop].angle,0.0f,0.0f,1.0f); // Rotate To The Current Stars Angle
glTranslatef(star[loop].dist,0.0f,0.0f); // Move Forward On The X Plane
我就让星星绕Z轴转自己的角度,再绕X轴平移自己距中心的距离,这样有什么问题呢?至少我是想不通。。。
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/08/07/846476.html,如需转载请自行联系原作者