一点小疑问

记得我第一次看 Nehe 教程里第 9 课的时候,就被他下面这段代码弄晕了:
None.gif glRotatef(tilt, 1.0f , 0.0f , 0.0f );                     //  Tilt The View (Using The Value In 'tilt')
None.gif
        glRotatef(star[loop].angle, 0.0f , 1.0f , 0.0f );         //  Rotate To The Current Stars Angle
None.gif
        glTranslatef(star[loop].dist, 0.0f , 0.0f );         //  Move Forward On The X Plane
None.gif
        glRotatef( - star[loop].angle, 0.0f , 1.0f , 0.0f );     //  Cancel The Current Stars Angle
None.gif
        glRotatef( - tilt, 1.0f , 0.0f , 0.0f );                 //  Cancel The Screen Tilt
None.gif

他给出的解释更是让我摸不着头脑:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

现在我们来移动星星。星星开始时位于屏幕的中心。我们要做的第一件事是把场景沿Y轴旋转。如果我们旋转90度的话,X轴不再是自左至右的了,他将由里向外穿出屏幕。为了让大家更清楚些,举个例子。假想您站在房子中间。再设想您左侧的墙上写着-x,前面的墙上写着-z,右面墙上就是+x咯,您身后的墙上则是+ z。加入整个房子向右转90度,但您没有动,那么前面的墙上将是-x而不再是-z了。所有其他的墙也都跟着移动。-z出现在右侧,+z出现在左侧,+x出现在您背后。神经错乱了吧?通过旋转场景,我们改变了xz平面的方向。
第二行代码沿x轴移动一个正值。通常x轴上的正值代表移向了屏幕的右侧(也就是通常的x轴的正向),但这里由于我们绕y轴旋转了坐标系,x轴的正向可以是任意方向。如果我们转180度的话,屏幕的左右侧就镜像反向了。因此,当我们沿 x轴正向移动时,可能向左,向右,向前或向后。

接着的代码带点小技巧。星星实际上是一个平面的纹理。现在您在屏幕中心画了个平面的四边形然后贴上纹理,这看起来很不错。一切都如您所想的那样。但是当您当您沿着y轴转上个90度的话,纹理在屏幕上就只剩右侧和左侧的两条边朝着您。看起来就是一条细线。这不是我们所想要的。我们希望星星永远正面朝着我们,而不管屏幕如何旋转或倾斜。
我们通过在绘制星星之前,抵消对星星所作的任何旋转来实现这个愿望。您可以采用逆序来抵消旋转。当我们倾斜屏幕时,我们实际上以当前角度旋转了星星。通过逆序,我们又以当前角度"反旋转"星星。也就是以当前角度的负值来旋转星星。就是说,如果我们将星星旋转了10度的话,又将其旋转-10度来使星星在那个轴上重新面对屏幕。下面的第一行抵消了沿y轴的旋转。然后,我们还需要抵消掉沿x轴的屏幕倾斜。要做到这一点,我们只需要将屏幕再旋转-tilt倾角。在抵消掉xy轴的旋转后,星星又完全面对着我们了。

 

今天又复习到这一课了,还是理解不了他干嘛要旋转坐标轴,接着又逆向旋转回去,就和susu讨论了下:

None.gif phinecos  15 : 53 : 12
None.gif我感觉他是多余了,我修改了下代码
None.gifphinecos 
15 : 53 : 22
None.gif效果也差不多呀
None.gifsusu 
15 : 53 : 31
None.gif是不是仅在距离上有点变化
None.gifphinecos 
15 : 53 : 38
None.gif        
// glRotatef(tilt,1.0f,0.0f,0.0f);                     //  Tilt The View (Using The Value In 'tilt')
None.gif
        glRotatef(star[loop].angle, 0.0f , 0.0f , 1.0f );         //  Rotate To The Current Stars Angle
None.gif

None.gif        glTranslatef(star[loop].dist,
0.0f , 0.0f );         //  Move Forward On The X Plane
None.gif
None.gif    
//     glRotatef(-star[loop].angle,0.0f,1.0f,0.0f);     //  Cancel The Current Stars Angle
None.gif    
//     glRotatef(-tilt,1.0f,0.0f,0.0f);                 //  Cancel The Screen Tilt
None.gif
susu  15 : 53 : 49
None.gif我看他唯一没有抵消的快乐能是dist了
None.gifphinecos 
15 : 54 : 17
None.gif没必要抵消嘛,他把坐标轴转了个90度,我认为没必要
None.gifsusu 
15 : 54 : 31
None.gif是啊,转来转去的
None.gifphinecos 
15 : 54 : 41
None.gifglRotatef(star[loop].angle,
0.0f , 0.0f , 1.0f );    
None.gifglTranslatef(star[loop].dist,
0.0f , 0.0f );        
None.gifphinecos 
15 : 55 : 05
None.gif我就这两句,让星星围着z轴转个角度,再平移个距离
None.gifsusu 
15 : 55 : 32
None.gif那又没有那个四边形没有正对着照相机?
None.gifphinecos 
15 : 56 : 05
None.gif好像没有呀
None.gifphinecos 
15 : 56 : 21
None.gif我再比对下效果看看
None.gifsusu 
15 : 56 : 27
None.gif对,前面坐标轴没有动
None.gifphinecos 
15 : 56 : 44
None.gif哪个坐标轴没动呢?
None.gifsusu 
15 : 57 : 01
None.gif
// glRotatef(tilt,1.0f,0.0f,0.0f);
None.gif
phinecos  15 : 57 : 38
None.gif这个坐标轴转个90度到底有啥用处吗?让四边形对着视点?
None.gifphinecos 
15 : 58 : 02
None.gif它这是绕x轴转90度,我想不通
None.gifsusu 
15 : 58 : 11
None.gif对阿
None.gifphinecos 
15 : 59 : 10
None.gif绕x轴转90度,那y,z轴就互换了,对吗?
None.gifsusu 
15 : 59 : 26
None.gif
None.gifphinecos 
15 : 59 : 34
None.gif这里转90度,是坐标轴转,还是物体转呢?
None.gifphinecos 
15 : 59 : 42
None.gif我认为是坐标轴呢
None.gifsusu 
15 : 59 : 46
None.gif坐标轴吧
None.gifphinecos 
16 : 00 : 31
None.gif那y,z轴既然已经换了,那这句:glRotatef(star[loop].angle,
0.0f , 1.0f , 0.0f );     //  旋转至当前所画星星的角度;到底是围着哪条轴转的?
None.gif
phinecos  16 : 01 : 02
None.gif本来应该是绕y轴,可现在z轴在它的位置上,不是变绕z了?
None.gifsusu 
16 : 01 : 09
None.gif应该是
None.gifphinecos 
16 : 02 : 06
None.gifglTranslatef(star[loop].dist,
0.0f , 0.0f );     //  沿X轴正向移动,这里又绕x轴平移,本来x轴就没动过,所以前面做的坐标轴变换不是白搭了。。。
None.gif
phinecos  16 : 02 : 37
None.gif我试下两种代码的效果区别先
None.gifsusu 
16 : 02 : 45
None.gif是啊
None.gifphinecos 
16 : 05 : 42
None.gif汗,我是看不出效果的区别。。。
None.gifsusu 
16 : 06 : 00
None.gif呵呵
None.gifsusu 
16 : 06 : 14
None.gifglTranslatef(star[loop].dist,
0.0f , 0.0f );是不是只做了一遍
None.gifphinecos 
16 : 06 : 28
None.gif恩,是的
None.gifsusu 
16 : 06 : 43
None.gif它应该是使星星分散开的
None.gifsusu 
16 : 06 : 58
None.gif想明白就可以了,呵呵
None.gifphinecos 
16 : 07 : 08
None.gif哦,那下面还有的:        star[loop].dist
-= 0.01f ;
None.gif        
if  (star[loop].dist < 0.0f )
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            star[loop].dist
+=5.0f;
InBlock.gif            star[loop].r
=rand()%256;
InBlock.gif            star[loop].g
=rand()%256;
InBlock.gif            star[loop].b
=rand()%256;
ExpandedBlockEnd.gif        }

None.gifphinecos 
16 : 07 : 23
None.gif先让它归中,然后抛出去
None.gifsusu 
16 : 07 : 34
None.gif形成动画
None.gifphinecos 
16 : 08 : 01
None.gif恩,我修改后的代码和Nehe的效果没什么区别,但没有刚才那么难理解了
None.gifphinecos 
16 : 08 : 15
None.gif刚才它旋转来,又旋转回去,晕掉了
None.gifsusu 
16 : 08 : 16
None.gif呵呵,他可能当时有点晕了
None.gif

我觉得他先把坐标轴绕X轴转了个90度,这不就让y,z轴互换了吗?再让四边形绕y轴(我理解这里应该是旋转后的z轴了)转自己的角度,最后平移自己到中心的距离,可最终他又反向旋转回去,真是让人晕,那这样旋转坐标轴到底有什么用处呢?不转还不是一样,我下面就修改了他的代码,根本不去转那个该死的坐标轴,好像最终效果也差不多呀:

None.gif     glRotatef(star[loop].angle, 0.0f , 0.0f , 1.0f );         //  Rotate To The Current Stars Angle
None.gif
        glTranslatef(star[loop].dist, 0.0f , 0.0f );         //  Move Forward On The X Plane
None.gif

我就让星星绕Z轴转自己的角度,再绕X轴平移自己距中心的距离,这样有什么问题呢?至少我是想不通。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值