[心得] gimbal lock
魔術方塊
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
推
02/10 07:26, , 1F
02/10 07:26, 1F
→
02/10 07:26, , 2F
02/10 07:26, 2F
※ 編輯: HsuanTang 來自: 114.26.220.190 (02/11 20:52)
→
02/11 20:54, , 3F
02/11 20:54, 3F