2014-11-11 5 views
0

그래서 Camera 클래스가 있습니다. 마녀는 앞으로, 앞으로 그리고 위치가 벡터입니다. 나는 위치를 변경하여 카메라를 이동 할 수 있으며, 나는이 자사의 행렬을 계산 해요 :glm을 사용하여 3D 카메라를 회전하는 방법

glm::mat4 view = glm::lookAt(camera->getPos(), 
    camera->getTarget(), //Caclates forwards end point, starting from pos 
    camera->getUp()); 

뮤 질문은, 내가 짐벌 락을받지 않고 카메라를 회전 할 수있는 방법. glm 쿼터니언에 대한 좋은 정보를 찾지 못했습니다. 심지어는 3 차원 프로그래밍의 쿼터니언도 발견하지 못했습니다.

답변

1

glm은 비교적 쉽게 쿼터니온을 만듭니다. 오일러 각도를 포함하는 glm :: vec3을 사용하여 쿼터니온을 시작할 수 있습니다 (예 : glm :: fquat (glm :: vec3 (x, y, z)). 곱셈에 의해 다른 쿼터니온에 의해 쿼터니온을 회전시킬 수 있습니다 (r = r1 * r2). 이것은 짐벌 잠금없이 수행합니다. 쿼터니언을 사용하여 행렬을 생성하려면 glm :: mat_cast (yourQuat)를 사용하여이를 회전 행렬로 변환하십시오.

그래서 3D 앱을 만들고 4 방정식에 방위를 저장하고 vec4에서 자신의 위치를 ​​저장 한 다음 View 행렬을 생성하려면 vec4 (0,0,1,1) 및 그것을 당신의 쿼터니언에 의해 생성 된 행렬에 곱한 다음, 그것을 포지션에 추가하면 목표를 얻을 수 있습니다. 상향 벡터는 quaternion 행렬에 vec4 (0,1,0,1)를 곱하여 얻을 수 있습니다. 더 이상 질문이 있으면 말해봐.

다른 두 가지 질문 당신이 opengl을 사용 중이며 Z 축이 전진 축이라고 가정합니다. (양수 X는 사용자에게서 멀어집니다.)

1). 앞으로 벡터를 변환하려면 쿼터니언에서 Y 축과 X 축에 대해 회전 할 수 있습니다. 예 : glm :: fquat (glm :: vec3 (rotationUpandDown, rotationLeftAndRight, 0)). 이것을 귀하의 오리엔테이션 쿼터니언에 곱하십시오.

2). 롤하려는 경우 앞으로 축이있는 구성 요소를 찾으십시오. OpenGL을 사용하고있는 것처럼 보일 때,이 축은 가장 긍정적 인 Z 축일 것입니다. glm :: veat (glm :: vec3 (0,0, rollAmt)). 그리고 이것을 당신의 오리엔테이션 쿼터니언에 곱하십시오. oriention = rollquat * 오리엔테이션.

참고 :: 여기 제가 도움이 될 함수가 있는데, 저는 이것을 카메라에 사용했습니다. 1 벡터를 다른 벡터로 변환하는 쿼트를 만듭니다 (예 : 전진 벡터를 다른 벡터로 변환).

//Creates a quat that turns U to V 
glm::quat CreateQuatFromTwoVectors(cvec3 U, cvec3 V) 
{ 
    cvec3 w = glm::cross(U,V); 
    glm::quat q = glm::quat(glm::dot(U,V), w.x, w.y, w.z); 
    q.w += sqrt(q.x*q.x + q.w*q.w + q.y*q.y + q.z*q.z); 
    return glm::normalize(q); 
} 
+0

작동하는 것 같습니다! 다음 두 가지 질문 만 있습니다. 1) 방향 벡터에 따라 앞으로 벡터를 회전시킬 수 있습니까? 2) 어떻게 카메라를 굴릴 수 있습니까? – Heiski

+0

두 질문에 답변하기 위해 위의 대답을 편집했습니다. – user3427457