昨日私は尋ねました:ピッチとヨーを呼び出すだけでカメラが回転するのはどうしてですか?
基本的に、「ジンバルロック」のおかげで、ピッチ+ヨーをすると必然的にローリング効果が発生することがわかりました。詳細については、その質問を読むことができます。
私はこれが起こらないようにしようとしています。通常のFPSシューティングゲームで見回すと、カメラがいたるところに転がることはありません。
これが私の現在のパッシブマウス機能です:
int windowWidth = 640;
int windowHeight = 480;
int oldMouseX = -1;
int oldMouseY = -1;
void mousePassiveHandler(int x, int y)
{
int snapThreshold = 50;
if (oldMouseX != -1 && oldMouseY != -1)
{
cam.yaw((x - oldMouseX)/10.0);
cam.pitch((y - oldMouseY)/10.0);
oldMouseX = x;
oldMouseY = y;
if ((fabs(x - (windowWidth / 2)) > snapThreshold) || (fabs(y - (windowHeight / 2)) > snapThreshold))
{
oldMouseX = windowWidth / 2;
oldMouseY = windowHeight / 2;
glutWarpPointer(windowWidth / 2, windowHeight / 2);
}
}
else
{
oldMouseX = windowWidth / 2;
oldMouseY = windowHeight / 2;
glutWarpPointer(windowWidth / 2, windowHeight / 2);
}
glutPostRedisplay();
}
これにより、(カーソルを中央に置いたまま)マウスの動きに基づいてカメラがピッチ/ヨーします。オリジナルのカメラクラスもここに投稿しました。
そのスレッドの誰かが、この影響が発生しないようにクォータニオンを使用することを提案しましたが、ウィキペディアのページを読んだ後は、単にそれらを理解していません。
OpenGL / Glutアプリでクォータニオンを作成して、不要なロールなしで「カメラ」を適切に見回せるようにするにはどうすればよいですか?