我在OpenGL中有一個攝像頭,在加入FPS控制器之前我沒有問題。問題是基本的FPS行爲是好的。攝像機向前,向後,向左和向右移動+向鼠標輸入提供的方向旋轉。問題在攝像機移動到目標位置的側面或後面時開始。在這種情況下,攝像機局部向前,向後,向左,向右例如: 如果目標物體位置在(0,0,0)且攝像機位置在( - )位置,則攝像機位置在( - 50,0,0)(目標左側),攝像頭正在看目標,然後來回移動,我必須使用左右移動鍵,而向前/向前鍵將攝像頭側向移動。 這裏是我使用來計算攝像機的位置,旋轉和注視矩陣的代碼:OpenGL FPS Camera相對於目標的運動目標
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數學LIB 。 我非常確定我必須乘以一些矢量(眼睛,中心等)與旋轉矩陣,但我不確定哪些。我試圖乘以_rowMatrix _rotationMatrix但它創造了一團糟。FPS相機位置的代碼旋轉計算取自here。但對於實際渲染,我使用可編程管線。
更新:
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而是使用常規和基本方法解決問題想知道如何使用我在這裏介紹的lookAt()方法。
方向由_center向量表示,它會根據鼠標輸入方向進行更新和相機旋轉,所以我不確定這是問題所在。 –