作者cjcat2266 (CJ Cat)
看板Flash
标题Re: [问题] 3D角度算式
时间Sat Aug 21 11:11:12 2010
昨天第一次放假从国军online暂时登出...
推文中的方法是速解法没错
但是如果还是对正确的计算方式有兴趣
那可以参考看看Quaternion和Matrix3D的概念
rotationX, Y, Z三者其实只是为了开发者方便而设计的三个setter methods
设定他们的值之後其实最後还是去修改背後的Matrix3D
最後画面上的呈现还是以这个Matrix3D为主
各第三方API几乎都有这三个setter methods
然後也有各自的Matrix3D换算方式
例如Stardust的Matrix3D从rotationX, Y, Z的换算方式
就是先算rotationZ、再算rotationY、最後是rotationX
实际式子可以参考Stardust的Matrix3D.set() method
http://bit.ly/bqgnt0
但是用三轴旋转角度来表示3D空间的旋转变形还是不够
要指定任意轴的旋转以及两角度之间的内插很难计算
例如从(10, 20, 30)转到(40, 30, 20)
绝不是直接把rotationX从10渐变到40, rotationY从20到30,rotationZ从30到20这麽容易
直接这样做的结果看起来会是很奇怪的旋转
这个时候就会需要用到Quaternion的概念
Quaternion是一种进阶的数学运算方式
顾名思义,Quaternion的字根"Quat"有"四"之意
Quatenion中文翻译为"四元数",你可以把他看成是一个四个数字一组的向量
可以大致想成是"旋转轴方向的三轴分量+旋转角度"
Quaterion有一个叫做SLERP (Spherical Linear Interpolation '球型内插法')的运算
可以准确的计算出两个任意旋转角度间的内插角度
当然这计算的input和output都是Quaternion
还需要将Quaternion转换成Matrix3D,才可以正确的把画面呈现
另外,也有将任意角度转轴和任意旋转角度换算成Quaternion的公式
於是,原po的问题解法就变成
1) 任意转轴 = Y轴 (0, 1, 0)
旋转角度 = 23.5度
2) 从Quaternion转换成Matrix3D
以Stardust的Quaternion class来写,大致就是这样
Quaterinon.buildFromAxisRotation(new Vec3D(0, 1, 0), 23.5).toMatrix()
Stardust的Quaternion class请见
http://bit.ly/da2FJi
你可以自行比较看看rotationX, Y, Z转换到Matrix3D
跟Quaterion转换到Matrix3D
所需要的乘法和三角函数运算,总数差不多,所以不用担心效能差距问题
但是如果要考虑到角度相加运算的话,那Quaternion就大幅胜过Matrix3D了
--
CJ Cat = Croa'J Cat = Cockroach Cat = 西街凯特 = 蜚蠊猫 = 蟑螂猫
Blog
http://cjcat.blogspot.com
Gallery
http://cjcat2266.deviantart.com
ptt2 Board CJWorkshop - 阿多比闪光(Adobe Flash)研讨区
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.45.161.216
※ 编辑: cjcat2266 来自: 114.45.161.216 (08/21 11:14)
1F:推 zswolf:大推!!!! 08/21 12:37
2F:推 etrexetrex:推 08/21 13:09
3F:推 kyzusmugoe:好深奥= =大推一下~! 08/21 15:09
4F:推 interboard:看到高手只能推了 虽然我都看不懂= = 08/21 15:51
5F:推 sextitanic:难得放假还热心教学,大大推啊 08/21 15:59
6F:推 uice:推~ 08/21 22:58
7F:推 dontpkme:推 08/22 20:29
8F:推 FLJX:CJ是我们的神! 08/24 18:58
9F:推 dsmwang:虽然看不懂,还是推XD 08/25 01:06