2012-12-12 41 views
0

我在OpenGL中有一個攝像頭,在加入FPS控制器之前我沒有問題。問題是基本的FPS行爲是好的。攝像機向前,向後,向左和向右移動+向鼠標輸入提供的方向旋轉。問題在攝像機移動到目標位置的側面或後面時開始。在這種情況下,攝像機局部向前,向後,向左,向右例如: 如果目標物體位置在(0,0,0)且攝像機位置在( - )位置,則攝像機位置在( - 50,0,0)(目標左側),攝像頭正在看目標,然後來回移動,我必須使用左右移動鍵,而向前/向前鍵將攝像頭側向移動。 這裏是我使用來計算攝像機的位置,旋轉和注視矩陣的代碼:OpenGL FPS Camera相對於目標的運動目標

void LookAtTarget(const vec3 &eye,const vec3 &center,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()方法。

回答

0

您需要更改相機的前進方向,推測其固定爲。您可以通過camYRot(如在lookat函數中計算)繞y軸旋轉方向,使得向前的方向與相機指向的方向相同(在由z和x軸構成的平面中),可以執行此操作。

+0

方向由_center向量表示,它會根據鼠標輸入方向進行更新和相機旋轉,所以我不確定這是問題所在。 –