2012-06-29 3 views
1

glm::rotate을 사용하여 장면의 큐브에 대한 변형 행렬을 회전합니다.4x4 매트릭스를 회전하면 시간이 지남에 따라 스케일이 발생합니다.

"cube->t = glm::rotate(cube->t, stepTime * 50.f, glm::vec3(0.f, 1.f, 0.f));"은 프레임 당 한 번 호출되며 여기서 cube->t은 문제의 매트릭스입니다.

이상한 것은입니다 (I 대신 stepTime * 50.fstepTime * 5000.f에 의해 회전하는 경우 또는 두 개의 분) 20 분에 걸쳐,이 두 축에 배율이 동일 X 및 Z 축에 띄게 큐브 저울 항상 (큐브의 높이는 결코 바뀌지 않지만 너비와 깊이는 정확히 같은 양만큼 바뀝니다). 5000.f의 경우, 작아지고, 통상적으로 50.f 또는 100.f이 커짐.

나는 이것이 반올림 오류의 문제 일 수 있다고 생각했지만 그 이외에 무엇이 그 원인이 될 수 있는지 전혀 모른다. 이 반올림 오류가 있습니까? 행렬을 정규화하여 해결할 수 있습니까? glm은 행렬을 정규화하는 함수를 가지고 있습니까? 아니면 직접 작성해야합니까?

+0

수학적 분석과 반복적 인 수치 결과 사이의 실제적인 차이점을 드러내는 흥미로운 질문을 던집니다. 나는 당신이 매트릭스를 표준화하는 것이 옳다고 생각합니다. – thb

+1

반올림 오류가 발생하지만 yonks 용 OpenGL을 사용하지 않았습니다. 매트릭스를 정규화하면 아이디어처럼 들릴 수 있습니다. 회전 매개 변수를 다른 회전 벡터와 다르게 적용하는지 확인하려고 시도 했습니까? – Charleh

+0

다른 벡터로 시도하지 않았습니다. 일단 내가 테스트 해보면 어떻게되는지 말해 줄께. – Miles

답변

7

증가분, 누적, 정확도 상실 : 큐브를 적절히 업데이트하는 대신 원래의 회전하지 않은 큐브를 유지하고 총 회전 각도를 추적하십시오. 그런 다음 각 단계에서 원래의 회전되지 않은 큐브에서 전체 누적 회전 각도로 변환 된 큐브를 만듭니다. 이 방법으로 큐브에 누적 라운딩 문제가 발생하지 않습니다.

편집 : 마일, 더 적절한 답변과 토론의 질문에 답변

당신은 변환 행렬의 회전 및 변환 구성 요소를 분리 할 수 ​​있고, 문제는 회전 도입 전단의 축적 주로 경우 또는 회전을 사용하면 회전 구성 요소에서 각도를 추출하고 해당 각도이지만 단위 길이로 회전 행렬을 다시 작성하여 문제를 해결할 수 있습니다.

+0

변경 사항을 점진적으로 저장해야하는 비디오 게임에 매트릭스를 사용하고 싶습니다. 시간이 지남에 따라 모델이 확장되지 않도록하려면 어떻게합니까? – Miles

+1

@ MilesRufat-Latre. 점진적으로 저장해야하는 경우 점진적으로 저장해야합니다. 그러나 누적 정밀도 문제가 발생하는 경우 최상의 (가장 안정적/정당한/견고한) 솔루션은 원본과 누적 변환을 나타내는 일부 데이터 구조를 유지하는 것입니다. 당신의 경우에는 이것이 가능하지 않다고 확신합니까? 그렇지 않으면 정규화를 시도 할 수 있습니다. 당신은 번역뿐만 아니라 번역을 적용하고 있습니까? –

+0

예, 동일한 행렬에서 번역과 회전을 모두 사용하겠습니다. (그리고 나는 점진적으로 변환을 저장하는 것을 피할 수 없다 : 게임은 3D 물리 시뮬레이션을 많이 포함하고, 다른 방법으로는 기능을 제한하는 변형을 추적한다) – Miles

0

예, 반올림 오류입니다. 합리적인 해결책은 방향을 단일 숫자로 저장하고 모든 프레임에 처음부터 행렬을 작성하는 것입니다.

+0

위의 대답에 대한 내 의견을 참조하십시오. – Miles

관련 문제