2012-12-29 105 views
1

其實,我正在編程一個有點太空射擊遊戲(2.5D,Topdown View)。玩家可以沿着XZ Axies移動,並通過右迷你遊戲(遊戲手柄)旋轉飛船,或者看光標位置(鍵盤+鼠標)。宇宙飛船:橫向滾動

所以,運動和旋轉(Y軸,偏航)是分開的。 整個事情工作正常,看起來不錯 - 但現在我想要做到以下幾點:

如果宇宙飛船橫向移動,它應該圍繞X/Pitch軸/左右傾斜一點,依賴於側身速度。

所以,我必須從以下,給定的輸入計算側身速度:

速度向量(運動對X和Z軸距,Y是總是「0」) 方向向量(旋轉Y上軸距, X和Z總是'0')

並且隨着橫向速度的增加,我可以圍繞X軸旋轉我的太空船,並通過圍繞Y軸旋轉產生的四元數。

任何有此解決方案的人?


解決方案只是「旋轉」速度由飛船的前進方向向量,並使用「卷/ Z」軸作爲繞X軸(軸,在你的船鼻子的側面旋轉朝分):

Quaternion Rotation  = Quaternion.Euler(0, mHeading.y, 0); 
Vector3 RealVeloctiy = Quaternion.Euler(0, -mHeading.y, 0) * Velocity; 
float Angle   = RealVeloctiy.z * 2.5f;   
Rotation   = Rotation * Quaternion.Euler(Angle, 0, 0); 

回答

2

幾個可能的原因:

  1. 比較VELO城市向量與飛船的局部左側方向(確保它們首先在同一個座標空間中)。您可以使用Vector3.Angle函數或點積來進行比較。適當縮放結果,並圍繞前進軸進行局部旋轉。

  2. 直接進行用戶輸入。如果用戶正在朝某個方向掃射,則應用滾動值。您可以使用-1和+1之間的浮點數以及變化率。如果他們正在掃射左側,則將該值以該速率移動到-1,或者如果他們正在掃射左側,則將其值改爲+1。如果兩個鍵均未按下,則將值移回0.(您可能也喜歡使用Lerp,SmoothStep和SmoothDamp函數)。縮放該值以應用關於相關軸的適當旋轉。

+0

解決方案一是一個很好的方法,我會嘗試這個 - 我正在尋找一種數學方法 - 用戶輸入將無法正常工作,因爲船的旋轉 - > [http:// imgur。 (http://imgur.com/bQ7oG) - 船舶應該在第一個(直接A&D)和第三個圖像中的黃色軸線(A&W或S&D或..)上圍繞綠軸旋轉) – lunatix

+0

感謝您的方法,這引導我以正確的方式:)現在正常工作:D – lunatix