私は OpenGL のカメラを持っています。FPS コントローラを追加するまで問題はありませんでした。問題は、基本的な FPS の動作に問題がないことです。カメラは前後左右に移動し、マウス入力によって指定された方向に向かって回転します。問題は、カメラがターゲット位置の横または後ろに移動したときに始まります。このような場合、カメラはローカルの前方、後方、左、右に移動します。方向は現在の前方の視線に基づいて更新されませんが、ターゲットの真正面にある場合と同じままです。例: ターゲット オブジェクトの位置が (0,0,0) で、カメラの位置が (-50) の場合,0,0) (ターゲットの左側) で、カメラがターゲットを見ている場合、前後に移動するにはキーを使用して左右に移動し、後方/前方キーでカメラを横に移動します。カメラの位置を計算するために使用するコードは次のとおりです。
void LookAtTarget(const vec3 &eye,const vec3 ¢er,const vec3 &up)
{
this->_eye = eye;
this->_center = center;
this->_up = up;
this->_direction =normalize((center - eye));
_viewMatrix=lookAt( eye, center , up);
_transform.SetModel(_viewMatrix );
UpdateViewFrustum();
}
void SetPosition(const vec3 &position){
this->_eye=position;
this->_center=position + _direction;
LookAtTarget(_eye,_center,_up);
}
void SetRotation(float rz , float ry ,float rx){
_rotationMatrix=mat4(1);
vec3 direction(0.0f, 0.0f, -1.0f);
vec3 up(0.0f, 1.0f, 0.0f);
_rotationMatrix=eulerAngleYXZ(ry,rx,rz);
vec4 rotatedDir= _rotationMatrix * vec4(direction,1) ;
this->_center = this->_eye + vec3(rotatedDir);
this->_up =vec3( _rotationMatrix * vec4(up,1));
LookAtTarget(_eye, _center, up);
}
次に、レンダリング ループでカメラの変換を設定します。
while(true)
{
display();
fps->print(GetElapsedTime());
if(glfwGetKey(GLFW_KEY_ESC) || !glfwGetWindowParam(GLFW_OPENED)){
break;
}
calculateCameraMovement();
moveCamera();
view->GetScene()->GetCurrentCam()->SetRotation(0,-camYRot,-camXRot);
view->GetScene()->GetCurrentCam()->SetPosition(camXPos,camYPos,camZPos);
}
lookAt() メソッドはGLM math lib から来ています。いくつかのベクトル (目、中心など) を回転行列で乗算する必要があることは確かですが、どのベクトルかはわかりません。_viewMatrix を _rotationMatrix で乗算しようとしましたが、混乱が生じます。回転計算はここから取得されますが、実際のレンダリングにはプログラム可能なパイプラインを使用します。
更新: lookAtを使用してカメラマトリックスを計算するのではなく、通常の基本的なアプローチを使用する別の方法を追加することで、問題を解決しました。
void FpsMove(GLfloat x, GLfloat y , GLfloat z,float pitch,float yaw){
_viewMatrix =rotate(mat4(1.0f), pitch, vec3(1, 0, 0));
_viewMatrix=rotate(_viewMatrix, yaw, vec3(0, 1, 0));
_viewMatrix= translate(_viewMatrix, vec3(-x, -y, -z));
_transform.SetModel( _viewMatrix );
}
問題は解決しましたが、ここで紹介した lookAt() メソッドで動作させる方法を知りたいです。