作者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
推 cjcat2266:gimbal lock的意思應該是"喪失一個旋轉自由度"吧 02/10 07:26
→ cjcat2266:之前那個花花的問題應該是因為matrix串接順序不對? 02/10 07:26
※ 編輯: HsuanTang 來自: 114.26.220.190 (02/11 20:52)
→ HsuanTang:"matrix串接順序"是什麼? 02/11 20:54