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);
}
작동하는 것 같습니다! 다음 두 가지 질문 만 있습니다. 1) 방향 벡터에 따라 앞으로 벡터를 회전시킬 수 있습니까? 2) 어떻게 카메라를 굴릴 수 있습니까? – Heiski
두 질문에 답변하기 위해 위의 대답을 편집했습니다. – user3427457