2012-12-12 2 views
0

OpenGL에 카메라가 있습니다. FPS 컨트롤러를 추가 할 때까지 아무런 문제가 없었습니다. 기본 FPS 동작이 정상입니다. 카메라가 앞으로, 뒤로, 왼쪽 및 오른쪽 + 마우스 입력에 의해 제공된 방향으로 회전합니다. 카메라가 대상 위치의 측면이나 뒤쪽으로 이동하면 문제가 시작됩니다. 그런 경우에는 로컬, 앞으로, 뒤로, 왼쪽, 오른쪽 카메라 방향은 현재 진행 모양을 기반으로 업데이트되지 않지만 대상 바로 앞에있는 것처럼 유지됩니다. 예 : 대상 객체 위치가 (0,0,0)이고 카메라 위치가 (- 50,0,0) (표적의 왼쪽으로) 카메라가 표적을 바라보고 있으면 앞뒤로 움직이기 위해서는 전진/후진 키로 카메라를 옆으로 움직여야합니다.lookAt 대상과 관련된 OpenGL FPS 카메라 이동

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); 

} 

바라() 메소드는 GLM 수학 lib 디렉토리에서 온다 : 나는 카메라의 변환을 설정 렌더링 루프에서 다음

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); 


} 

: 여기 내가 카메라 위치, 회전 및 바라 행렬을 계산하는 데 사용하는 코드입니다 . 회전 벡터를 사용하여 벡터 (눈, 중심 등) 중 일부를 곱해야하지만 어느 것이 확실하지는 않습니다. _rotationMatrix에 의해 _viewMatrix를 곱하려고했지만 엉망이 생깁니다. 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() 메소드로 어떻게 동작하게하는지 알고 싶다.

답변

0

카메라의 정방향을 변경해야합니다 (아마 으로 고정되어 있음). 전달할 방향이 카메라가 가리키는 방향 (z 축과 x 축에 의해 만들어진 평면)이되도록 camyRot (lookat 함수에서 계산 된)에 의해 y 축에 대한 방향을 회전하여이를 수행 할 수 있습니다.

+0

방향은 _center vector로 표시됩니다. 카메라가 마우스 입력 방향에 따라 업데이트되고 카메라가 회전하므로 문제가 있는지 잘 모르겠습니다. –