2

位置ベクトルとオイラー角のピッチとヨー (x と y 回転) で構成されるカメラを使用して、FPS スタイルのカメラを実装しました。射影行列を設定した後、回転させてカメラ座標に変換し、次にカメラ位置の逆に変換します。

// Load projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Set perspective
gluPerspective(m_fFOV, m_fWidth/m_fHeight, m_fNear, m_fFar);

// Load modelview matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// Position camera
glRotatef(m_fRotateX, 1.0, 0.0, 0.0); 
glRotatef(m_fRotateY, 0.0, 1.0, 0.0); 
glTranslatef(-m_vPosition.x, -m_vPosition.y, -m_vPosition.z);

これで、それぞれ独自のカメラを備えたいくつかのビューポートがセットアップされました。すべてのカメラから、他のカメラの位置を (単純なボックスとして) レンダリングします。これらのカメラのビュー ベクトルも描画したいと思いますが、位置とオイラー角からルックアット ベクトルを計算する方法がわかりません。元のカメラ ベクトル (0, 0, -1) にカメラの回転を表す行列を乗算してから、変換されたベクトルにカメラの位置を追加しようとしましたが、まったく機能しません (ほとんどの場合、私がベースから離れた方法):

vector v1(0, 0, -1);
matrix m1 = matrix::IDENTITY;
m1.rotate(m_fRotateX, 0, 0);
m1.rotate(0, m_fRotateY, 0);

vector v2 = v1 * m1;
v2 = v2 + m_vPosition; // add camera position vector

glBegin(GL_LINES);
glVertex3fv(m_vPosition);
glVertex3fv(v2);
glEnd();

私が望むのは、カメラから視線方向に向かって線分を描くことです。この例をあちこち探しましたが、何も見つからないようです。

どうもありがとう!

4

1 に答える 1

4

私はちょうどそれを理解しました。答えを追加するために戻ったとき、Ivan がちょうど同じことを私に言ったことがわかった :)

基本的に、カメラ ベクトルを描画するには、次のようにします。

glPushMatrix();

// Apply inverse camera transform
glTranslatef(m_vPosition.x, m_vPosition.y, m_vPosition.z);
glRotatef(-m_fRotateY, 0.0, 1.0, 0.0); 
glRotatef(-m_fRotateX, 1.0, 0.0, 0.0); 

// Then draw the vector representing the camera
glBegin(GL_LINES);
glVertex3f(0, 0, 0);
glVertex3f(0, 0, -10);
glEnd();

glPopMatrix();

これにより、カメラの位置から視線方向に 10 単位の線が引かれます。

于 2010-05-04T10:42:03.070 に答える