2013-03-25 3 views
2

안녕하세요 여러분 glm 라이브러리에서 lookAt를 사용하는 Camera 클래스를 사용하려고합니다. 나는 4 점을 가지고 있는데, 첫 번째는 눈, 즉 공간상의 카메라 위치, 두 번째는 카메라가보고있는 지점, 세 번째는 카메라의 방향을 설정하는 upp입니다. , 그리고 네 번째는 측면입니다. 그것은 look - eye와 upp-ee의 교차 생성물입니다.lookAt를 사용한 카메라 회전

결국 결국 나는 3 개의 벡터로 된베이스를 얻었고, 그 중 3 개의 벡터는 모두 원점을 가지고 있습니다. 나는 카메라의 좌표 시스템을 가지고있다.

내 카메라 클래스에서 전 세계의 좌표계가 아닌 카메라의 좌표계를 중심으로 회전 할 수 있기를 원합니다. 그래서 제가하고있는 일은 카메라 좌표계의 축 중 하나를 회전시키는 것입니다.

I는 다음과 같이 초기 값을 가지는 클래스를 생성 :

void Observer::initialize(glm::vec3 eye, glm::vec3 look, glm::vec3 upp, glm::vec3 side) 
{ 
    this->eye = eye;  // (0.0, 0.0, 0.0) 
    this->look = look;  // (0.0, 0.0, -1.0) 
    this->upp = upp;  // (0.0, 1.0, 0.0) 
    this->side = side;  // (1.0, 0.0, 0.0) 
} 

를 I는 I 이렇게 GLM에서 함수 호출, 예를 들면, x 축에 대한 좌표계를 회전 할 때 :

void Observer::pitch(GLfloat pitch) 
{ 
    glm::mat4 rotate(1.0f); 

    rotate = glm::rotate(rotate, pitch, side - eye); 

    look = glm::vec3(rotate * glm::vec4(look, 1.0f)); 
    upp = glm::vec3(rotate * glm::vec4(upp, 1.0f)); 
} 

지금까지, 모든 포인트가 여전히 카메라의 좌표계를 형성하고 모든 벡터가 서로 수직이라는 것을 이해하고 있습니다.

그러나 나는 lookAt 함수를 사용하여이 점을 사용하여 카메라를 세계에 배치합니다. 나는 다른 방법으로 회전하는 것처럼

glm::mat4 view = glm::lookAt(eye, look, upp); 

내가 많이 회전하기 시작하면 OpenGL을

에서 모델 뷰 행렬이 행렬을 곱는 몇 회전 후 카메라 (회전을 "반영" 나는 더 나은 방법으로 실제로 일어나고있는 것을 기술하는 방법을 모른다.

나는 정말로 무슨 일이 일어나고 있는지 이해하지 못한다. 회전을 적용한 후 벡터를 정규화해야합니까? 짐벌 잠금 장치에 문제가 있습니까 (나는 짐벌 잠금 장치에 대해 많이 모릅니다)?

답변

2

벡터에서 점진적 회전을 수행하면 수치 오류가 발생합니다. 오류로 인해 위쪽 벡터와 룩업 벡터가 거의 같은 방향을 향하거나 서로 마주 보게되면 카메라 변형 계산이 불안정하고 괴상한 일이 발생할 수 있습니다. 짐발 자물쇠. 길이 변경으로 인해 다른 문제가 발생합니다.

나를 위해 효과가있는 해결책은 매 회전 후 위쪽 벡터와 룩업 벡터를 다시 직교 화하는 것입니다. 이렇게하려면 교차 곱 L을 계산 한 다음 L을 lookAt와 교차시켜 위로 벡터를 조정합니다. 이 모든 일이 끝나고 단위 길이를 다시 보았습니다.

직교 화 정규화는 빠른 작업이지만 모든 카메라 동작마다 실제로 수행 할 필요는 없습니다.

이와 같은 벡터를 수정하면 실제로 lookAt 행렬 계산의 일부를 수행하므로 불필요한 교차 제품을 피하기 위해 직접 구현하는 것이 좋습니다. 예 : this prior SO article on this topic.