作者HsuanTang (HsuanTang)
看板Flash
标题[心得] gimbal lock
时间Thu Feb 9 20:10:34 2012
魔术方块
http://www.fileden.com/files/2012/2/3/3259292/MyGame/MagicCube.swf
总算不会越转越花了..
说明:
方向键:旋转视角
zxcasdqwe:旋转方块
enter:一直按着可以洗牌
之前发现使用rotationY转90度後
接下来再用rotationX跟rotationZ会变得很怪
这个现象叫gimbal lock
是euler angles本身的缺陷所造成的
而flash的rotationX, rotationY, rotationZ都是使用euler angles
如果只需要单轴旋转的话 可以放心使用没关系
但如果旋转多轴 使用euler angles有可能会产生gimbal lock
使得旋转不如预期
除了euler angles外 quaternion也可用来旋转
而且quaternion不会像euler angles那样有gimbal lock
flash也有支援quaternion 例如:
var vectors:Vector.<Vector3D> =
sprite1.transform.matrix3D.decompose(Orientation3D.QUATERNION);
这样就可以获得sprite1目前的"移动","旋转"及"缩放"的资讯
其中"旋转"会以quaternion的方式呈现
对vectors稍加修改後 再存回去
sprite1.transform.matrix3D.recompose(vectors,Orientation3D.QUATERNION);
就可以藉此操控sprite1的"移动","旋转"及"缩放"了
不过在decompose後 取得vectors中的quaternion值後
要如何对quaternion进行操作 flash好像还没有提供相关的函式..
我也不懂quaternion值是怎麽求来的 要如何修改..
google後找到了这个:
Multiplying quaternions
Multiplying q1 with q2 applies the rotation q2 to q1
原来只要把两个quaternion相乘就可以旋转了
我先把X转1度的quaternion值存起来放rotX
以後谁要X转 就把它乘rotX 它就会X转1度了
同理rotY跟rotZ也是
试了一下 可以转 而且不会产生gimbal lock了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.38.156.3
1F:推 cjcat2266:gimbal lock的意思应该是"丧失一个旋转自由度"吧 02/10 07:26
2F:→ cjcat2266:之前那个花花的问题应该是因为matrix串接顺序不对? 02/10 07:26
※ 编辑: HsuanTang 来自: 114.26.220.190 (02/11 20:52)
3F:→ HsuanTang:"matrix串接顺序"是什麽? 02/11 20:54