クォータニオンに格納された回転を使用して一人称カメラをコーディングしたいと考えています。残念ながら、回転に問題があります。
次の関数は、カメラの回転を担当します。パラメータは、マウスの移動と回転速度Mouse
を渡します。Speed
次に、関数は回転クォータニオンをフェッチし、それを回転させ、結果を保存します。ところで、私はタイプと関数の由来であるBullet Physicsを使用しています。
void Rotate(vec2 Mouse, float Speed)
{
btTransform transform = camera->getWorldTransform();
btQuaternion rotation = transform.getRotation();
Mouse = Mouse * Speed; // apply mouse sensitivity
btQuaternion change(Mouse.y, Mouse.x, 0); // create quaternion from angles
rotation = change * rotation; // rotate camera by that
transform.setRotation(rotation);
camera->setWorldTransform(transform);
}
マウスが移動したときのカメラの回転を説明するために、手描きを示します。左側には、カメラが実際に実行する間違った回転が示されています。右側には、目的の正しいケースが表示されます。矢印は、マウスを上 (オレンジ色) および下 (青色) に動かしたときにカメラがどのように回転するかを示します。
ご覧のとおり、ヨーがゼロである限り、回転は正しいです。しかし、ヨーが大きくなるほど、カメラが回転する円は小さくなります。対照的に、円は経度のように常に球全体に沿って走る必要があります。
私はクォータニオンにあまり詳しくないので、ここでそれらを正しく回転させる方法を尋ねます。