변환 행렬 곱셈 순서


21

최종 변환 행렬의 올바른 곱셈 순서를 파악하는 데 어려움이 있습니다. 나는 항상 이상한 움직임이나 왜곡 된 도형을 얻습니다. 내 현재 모델은 다음과 같습니다.

단일 노드의 경우 곱셈 순서는 다음과 같습니다.

L = S * R * T

어디에

L = 국소 변형 행렬

S = 로컬 스케일 매트릭스

R = 국부 회전 행렬

T = 로컬 변환 매트릭스

노드의 세계 변형의 경우 :

W = PW * L

어디에

W = 세계 변환 행렬

PW = 부모 세계 변환 행렬

L = 위에서 계산 한 국소 변환 행렬

렌더링 할 때 각 노드에 대해 행렬을 계산합니다.

MV = Inv (C) * NW

어디에

MV = 특정 노드에 대한 모델 뷰 변환 매트릭스

Inv (C) = 역 카메라 변환 행렬

NW = 위에서 계산 된 노드의 세계 변환 행렬.

마지막으로, 셰이더에는 다음과 같은 변형이 있습니다.

TVP = PRP * MV * VP

어디에

TVP = 최종 변환 된 정점 위치

PRP = 원근 매트릭스

MV = 위에서 계산 한 노드의 세계 변환 행렬

VP = 변형되지 않은 정점 위치.

현재 모델에서 로컬 회전이있는 자식 노드는 카메라를 변환 할 때 이상하게 회전합니다. 곱셈 순서는 어디에서 잘못 되었습니까?

답변:


37

순서의 모든 조합은 S*R*T유효한 변환 행렬을 제공합니다. 그러나 먼저 객체의 크기를 조절 한 다음 회전 한 다음 번역하는 것이 일반적입니다.

L = T * R * S

이 순서대로 수행하지 않으면 비 균일 스케일링이 이전 회전의 영향을 받아 오브젝트가 비뚤어지게 보입니다. 그리고 회전은 번역의 영향을 받아 객체의 최종 위치가 번역 값이 기대하는 것과 매우 다릅니다.


좀 더 설명해 주시겠습니까? 내가 익숙한 것으로부터, 회전은 위치와 무관하게 두 프레임 사이의 방향 차이 때문에 변환에 의해 영향을받을 수 없습니다. 대신, 변환은 새로 정의 된 회전 축에서 변환되므로 변환 전에 발생하는 회전의 영향을받을 수 있습니다. L = TRS에서는 변환이 먼저 발생하므로 회전에 의해 생성 된 새 벡터의 영향을받지 않습니다.
user-2147482637

4
혼란은 로컬 변환 (프레임이 객체에 연결된 상태로 유지되는)에 대해 이야기하는 반면, 여기에 설명 된 변환은 월드 공간 (세계에는 고정 된 참조 프레임이 하나만있는 곳)에서 발생합니다. 개념적으로 사물을 보는 방법은 유효하며 변환을 역순으로 적용하는 것과 같습니다.
sam hocevar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.