0

OpenGLでフリーローミングカメラを作ろうとしています。現在、カメラは前後左右に動きます。私の次の目標は、あなたが見ている方向に移動できるようにすることです。

これまでの私のコードは次のとおりです。

float yawRad = Rotation -> y * (3.1415f/180);
float pitchRad = Rotation -> x * (3.1415f/180);

if(myInput.Keys[VK_W]) //Forward
{
    curPos->x += sin(yawRad) * myInput.Sensitivity;
    curPos->z -= cos(yawRad) * myInput.Sensitivity;
}
else if(myInput.Keys[VK_S]) //Backward
{
    curPos->x -= sin(yawRad) * myInput.Sensitivity;
    curPos->z += cos(yawRad) * myInput.Sensitivity;
}

if(myInput.Keys[VK_A]) //Left
{
    curPos->x -= cos(yawRad) * myInput.Sensitivity;
    curPos->z -= sin(yawRad) * myInput.Sensitivity;
}
else if(myInput.Keys[VK_D]) //Right
{
    curPos->x += cos(yawRad) * myInput.Sensitivity;
    curPos->z += sin(yawRad) * myInput.Sensitivity;
}

if(myInput.Keys[VK_E]) //Up
{
    curPos->y += myInput.Sensitivity;
}
else if(myInput.Keys[VK_Q]) //Down
{
    curPos->y -= myInput.Sensitivity;
}

myInput.Sensitivityマウス ホイールで制御される float で、値は 0.0005 増加/減少します。

Rotationx、y、z 値 (float) を格納するベクトル クラスです。

私の質問は、フリー ローミングを実現するためにコードを変更するにはどうすればよいかということです。

4

1 に答える 1

1

modelview マトリックスの 1 列目、2 列目、3 列目から、カメラの左、上、前のベクトルを取得できます。もちろん、構成した後です。

float mview[16];
float front[4], up[4], left[4];

glGetFloatv(GL_MODELVIEW_MATRIX, mview);
left[0] = mview[0]; left[1] = mview[1]; left[2] = mview[2]; left[3] = 1.0;
up[0] = mview[4]; up[1] = mview[5]; up[2] = mview[6]; up[3] = 1.0;
front[0] = mview[8]; front[1] = mview[9]; front[2] = mview[10]; front[3] = 1.0;

その後、移動する位置に適切なベクトルを追加するだけです。

if(myInput.Keys[VK_A]) //Left
{
    curPos->x += left[0] * myInput.Sensitivity;
    curPos->z += left[z] * myInput.Sensitivity;
}
else if(myInput.Keys[VK_D]) //Right
{
    curPos->x -= left[0] * myInput.Sensitivity;
    curPos->z -= left[2] * myInput.Sensitivity;
}
// etc.

詳しくはこちらのページをご覧ください。同じサイトのこの別のページでは、回転角度を使用してモデル ビュー マトリックスを取得する方法が説明されています。したがって、上記の列ベクトルが得られます。同じテクニック (ただし、座標系が若干異なります) は、たとえば地震ゲーム エンジン シリーズでも使用されています。

于 2013-04-21T23:09:48.407 に答える