自分でクォータニオンを適切に回転させる方法を見つけました。重要なのは、回転させたい軸のベクトルを見つけることでした。これらは、角度が実際の軸を中心に回転する量である場合に、軸と角度からクォータニオンを作成するために使用されます。
次のコードは、私が最終的に得たものを示しています。また、カメラを回転させることもできます。これは、いつか役立つかもしれません。
void Rotate(btVector3 Amount, float Sensitivity)
{
// fetch current rotation
btTransform transform = camera->getWorldTransform();
btQuaternion rotation = transform.getRotation();
// apply mouse sensitivity
Amount *= Sensitivity;
// create orientation vectors
btVector3 up(0, 1, 0);
btVector3 lookat = quatRotate(rotation, btVector3(0, 0, 1));
btVector3 forward = btVector3(lookat.getX(), 0, lookat.getZ()).normalize();
btVector3 side = btCross(up, forward);
// rotate camera with quaternions created from axis and angle
rotation = btQuaternion(up, Amount.getY()) * rotation;
rotation = btQuaternion(side, Amount.getX()) * rotation;
rotation = btQuaternion(forward, Amount.getZ()) * rotation;
// set new rotation
transform.setRotation(rotation);
camera->setWorldTransform(transform);
}
クォータニオン回転に関する情報はめったに見つからないので、上記のコードについてさらに説明することに時間を費やします。
回転のフェッチと設定は物理エンジンに固有のものであり、この質問とは関係がないため、詳しくは説明しません。次の部分、量にマウスの感度を掛けることは、非常に明確なはずです。方向ベクトルを続けましょう。
- ベクトルは、独自の
up実装に依存します。最も便利なのは、正の Y 軸が上を指すため、最終的に になり0, 1, 0ます。
lookatベクトルは、カメラが見ている方向を表します。カメラ回転クォータニオンによって前方を指す単位ベクトルを単純に回転させます。繰り返しますが、前方を指すベクトルは規則によって異なります。Y 軸が上向きの場合、正の Z 軸が前方を指している可能性があり0, 0, 1ます。
- それを次のベクターと混同しないでください。
forwardカメラの回転を参照する名前が付けられています。lookatしたがって、ベクトルを地面に投影するだけです。この場合、単純にlookatベクトルを取得し、上向きのコンポーネントを無視します。きちんとするために、そのベクトルを正規化します。
- ベクトルは
sideカメラの向きから左向きです。したがって、それはupとforwardベクトルの両方に垂直であり、外積を使用して計算できます。
これらのベクトルが与えられると、それらの周りでカメラのクォータニオンを正しく回転させることができます。Z、Y、または Z のどれから開始するかは、オイラー角シーケンスに依存します。これも、アプリケーションごとに異なる規則です。回転をYXZ順に適用したいので、次のようにします。
- 最初に、カメラを
up軸の周りに Y 回転の量だけ回転させます。これがヨーです。
- 次に
side、左を指す軸を中心に X 量だけ回転します。ピッチです。
- 最後に、
forwardベクトルを中心に Z 量だけ回転してロールを適用します。
これらの回転を適用するには、現在のカメラの回転で軸と角度によって作成されたクォータニオンを乗算する必要があります。最後に、結果のクォータニオンを物理シミュレーションのボディに適用します。