Jason L. McKesson의 온라인 "Learning Modern 3D Graphics Programming"책을 읽고 있습니다
현재 짐벌 잠금 문제와 쿼터니언을 사용하여 해결하는 방법에 달려 있습니다.
그러나 바로 여기, Quaternions 페이지에서 .
문제의 일부는 방향을 일련의 3 축 축 회전으로 저장하려고한다는 것입니다. 방향은 회전이 아니라 방향입니다. 그리고 방향은 확실히 일련의 회전이 아닙니다. 따라서 우리는 선박의 방향을 특정 수량으로 방향으로 취급해야합니다.
나는 이것이 혼란스러워지기 시작한 첫 번째 지점이라고 생각합니다. 왜냐하면 방향과 회전의 극적인 차이를 보지 못하기 때문입니다. 또한 방향을 일련의 회전으로 나타낼 수없는 이유를 이해하지 못합니다 ...
또한:
이 목적을 향한 첫 번째 생각은 방향을 행렬로 유지하는 것입니다. 방향을 수정해야 할 때이 행렬에 변환을 적용하여 결과를 새로운 현재 방향으로 저장합니다.
즉, 현재 방향에 적용된 모든 요, 피치 및 롤은 해당 현재 방향에 상대적입니다. 정확히 우리가 필요로하는 것입니다. 사용자가 양의 요를 적용하는 경우 일부 고정 좌표계가 아니라 현재의 위치를 기준으로 요를 회전 시키려고합니다.
개념은 이해하지만 매트릭스 변환을 축적하는 것이이 문제에 대한 해결책인지 , 이전 페이지에 제공된 코드 가 그렇게 단순한 지 이해하지 못합니다.
코드는 다음과 같습니다.
void display()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutil::MatrixStack currMatrix;
currMatrix.Translate(glm::vec3(0.0f, 0.0f, -200.0f));
currMatrix.RotateX(g_angles.fAngleX);
DrawGimbal(currMatrix, GIMBAL_X_AXIS, glm::vec4(0.4f, 0.4f, 1.0f, 1.0f));
currMatrix.RotateY(g_angles.fAngleY);
DrawGimbal(currMatrix, GIMBAL_Y_AXIS, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
currMatrix.RotateZ(g_angles.fAngleZ);
DrawGimbal(currMatrix, GIMBAL_Z_AXIS, glm::vec4(1.0f, 0.3f, 0.3f, 1.0f));
glUseProgram(theProgram);
currMatrix.Scale(3.0, 3.0, 3.0);
currMatrix.RotateX(-90);
//Set the base color for this object.
glUniform4f(baseColorUnif, 1.0, 1.0, 1.0, 1.0);
glUniformMatrix4fv(modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(currMatrix.Top()));
g_pObject->Render("tint");
glUseProgram(0);
glutSwapBuffers();
}
필자가 이해할 수있는 것은 (스택에서 행렬 수정) 행렬 누적을 고려한 것이 아닙니다. 작성자가 모든 개별 회전 변환을 스택 맨 위에 저장되는 하나의 행렬로 결합했기 때문입니다.
매트릭스에 대한 나의 이해는 그것들이 원점을 기준으로 한 점을 취하고 (모델이라고 말합시다) 다른 원점 (카메라)을 기준으로 만드는 데 사용된다는 것입니다. 나는 이것이 안전한 정의라고 확신하지만,이 짐벌 잠금 문제를 이해하지 못하게하는 무언가가 빠진 것처럼 느낍니다.
나에게 이해가되지 않는 한 가지는 : 행렬이 두 "공간"사이의 상대적인 차이를 결정하는 경우 롤에 대해 Y 축을 중심으로 회전하는 방법은 롤입니다. "이 롤과 관련하여 다시 한 번 변형 될 수 있습니다. 다시 말해서이 지점에 대한 추가 변환이이 새로운"롤 공간 "과 관련되어 있지 않으므로 회전이 이전" 짐벌 잠금을 일으키는 모델 공간 "
그것이 짐벌 잠금이 올바르게 발생하는 이유입니다. 자체 상대 축을 중심 으로 개체를 회전시키는 대신 설정된 X, Y 및 Z 축을 중심으로 개체를 회전시키기 때문 입니다. 아니면 내가 틀렸어?
분명히 내가 링크 한이 코드는 행렬 변환의 축적이 아니기 때문에이 방법을 사용하는 솔루션의 예를 제시 할 수 있습니다.
요약하면 다음과 같습니다.
- 회전과 방향의 차이는 무엇입니까?
- 코드가 행렬 변환 누적의 예가 아닌 이유는 무엇입니까?
- 내가 잘못했다면 매트릭스의 실제적이고 구체적인 목적은 무엇입니까?
- 행렬 변환 누적을 사용하여 짐벌 잠금 문제에 대한 솔루션을 어떻게 구현할 수 있습니까?
- 또한 보너스로서 : 왜 회전 이후의 변환이 여전히 "모델 공간"과 관련이 있습니까?
- 또 다른 보너스 : 변환 후 전류와 관련하여 추가 변환이 발생한다는 가정에서 틀린 것입니까?
또한 암시되지 않은 경우 OpenGL, GLSL, C ++ 및 GLM을 사용하고 있으므로 필요하지 않은 경우 이러한 관점에서 예제와 설명을 높이 평가합니다.
세부 사항이 많을수록 좋습니다!
미리 감사드립니다.