1

実際、私は小さなスペースシューター ゲーム (2.5D、トップダウン ビュー) をプログラミングしています。プレイヤーは XZ 軸に沿って移動し、右ミニスティック (ゲームパッド) を介して宇宙船を回転させるか、カーソル位置 (キーボード + マウス) を見ることができます。

そのため、動きと回転 (Y 軸、ヨー) は分離されています。全体が正常に機能し、見栄えがします-しかし、今は次のことをしたいです:

宇宙船が横に移動する場合、横方向の速度に応じて、X / ピッチ軸を中心に回転 / 左右に少し傾く必要があります。

したがって、次の入力から横方向の速度を計算する必要があります。

速度ベクトル (X 軸と Z 軸の動き、Y は常に「0」) 方向ベクトル (Y 軸の回転、X と Z は常に「0」)

そして、横向きの速度で、宇宙船を X 軸の周りで回転させ、結果の四元数に y 軸の周りの回転を掛けることができます。

これに対する解決策を持っている人はいますか?


解決策:宇宙船の向きで速度ベクトルを「回転」させ、「roll/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);
4

1 に答える 1

2

いくつかの可能性:

  1. 速度ベクトルを宇宙船のローカル左方向と比較します (最初にそれらが同じ座標空間にあることを確認してください)。Vector3.Angle 関数または内積を使用して比較を行うことができます。結果を適切にスケーリングし、前方軸を中心にローカル回転を適用します。

  2. ユーザー入力を直接受け取ります。ユーザーがある方向に機銃掃射している場合は、ロール値を適用します。-1 から +1 の間の float と変化率を使用できます。彼らが左に機銃掃射している場合は、値をその速度で -1 の方に動かし、左に機銃掃射している場合は +1 に動かします。どちらのキーも押されていない場合は、値を 0 に戻します (Lerp、SmoothStep、SmoothDamp 関数も試してみてください)。値をスケーリングして、関連する軸を中心に適切な回転を適用します。

于 2012-12-29T23:32:03.870 に答える