flash 3d flash3d 研究所 pv3d 共享资源  | 经典范例  | 视频教程  | 友情链接  | 联系我们
登陆 | 注册  flash 3d 研究所
讨论区





最近更新:
● 无语瓶阁下在教程区里 回复“《超简易papervision3D基础 ...”(18:09:44)
● payday loan阁下在教程区里 回复“《pv3d, sandy, away3d...”(05:56:23)
● bad credit payday loan阁下在教程区里 回复“《超简易papervision3D基础 ...”(05:56:13)
浏览主题:用欧拉角实现物体旋转问题

用欧拉角实现物体旋转问题
ericvan76 (2009-06-11 09:42:01)

我试着输入一个欧拉角,来确定物体在空间的朝向(绕本地轴)。

var m:Matrix3D=Matrix3D.euler2matrix(deg);
this.transform.calculateMultiply(m, this.transform);

这样转是转过来了,但不是自转,是公转。

我不想用pitch(), yaw(), roll() 和 设置 localRotation 的方法来实现,因为涉及到一个欧拉角的旋转顺序问题。我想通过直接输入欧拉角的改变矩阵的方式来实现,理论上讲应该可行,请问有何办法?

我看过set localRotationX的源代码,是用四元数矩阵和transform相乘之后,然后又设置了_localRotation属性,我原本以为这句话只是一个赋值而已,但发现把这句去掉就不行。也许,要做自转的话只改变矩阵是不行的?

           public function set localRotationX( angle:Number ):void
           {
                 angle = Papervision3D.useDEGREES? angle * toRADIANS : angle;

                 if( this._transformDirty ) updateTransform();

                 _qPitch.setFromAxisAngle(transform.n11, transform.n21, transform.n31, _localRotationX-angle );
                 
                 this.transform.calculateMultiply3x3( _qPitch.matrix , transform );
                 
                 _localRotationX = angle;
                 
                 _rotationDirty = true;
           }




flash 3d 研究所 DDM君
(2009-06-11 10:24:31)
您说的‘自转’是local坐标转,其原理是在进行transform矩阵变化时,先把原点返回到物体的中心点,也就是说要先乘一个反向世界坐标。

flash 3d 研究所 ericvan76
(2009-06-11 10:49:22)
多谢"DDM君",思路我了解了。

另一个问题,假设一个物体的中心点在原点,我想让他自转,能不能不用pitch, yaw, roll 以及 localRotation,而只通过改变transform来实现?

flash 3d 研究所 DDM君
(2009-06-11 11:01:09)
当然,只要物体在原点,或乘transform之前乘一个返回原点矩阵,用欧拉(如果无目标位置)和四元数(如果有目标位置)都可以的。
可参考我们这篇教程
http://www.flab3d.com/tutorial.php?top=t21quat

或直接去看看我们flab3d包里面FlabCamera3D摄像机的代码。

flash 3d 研究所 ericvan76
(2009-06-11 11:25:15)
嗯,谢了!

评论人:
邮   箱: (填入邮箱,博客地址均可)

内   容: (广告和垃圾内容可能会被删除,望理解)
链接地址

验证码:(为防止机器人骚扰,请麻烦输入验证码^_^)
  

(目前需登陆方可发表)


不想添加了