변환 행렬 곱셈 순서


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.