숏컷 코드
modelMatrix = translation * rotation * scale
worldPosition = modelMatrix * localPosition문법과 예시
행렬 곱셈 순서가 바뀌면 결과가 완전히 달라진다
행렬 곱셈은 교환 법칙이 성립하지 않습니다. T * R * S와 S * R * T는 같은 변환이 아닙니다. 흔한 실수는 "이동, 회전, 크기 변형은 독립적이니 순서가 없을 것"이라는 오해입니다. 실제로는 scale을 먼저 적용한 뒤 rotation을 하면 scale이 로컬 축 기준으로 작용하고, translation을 먼저 하면 회전 중심이 달라집니다. TRS(Translation * Rotation * Scale) 순서가 표준으로 쓰이는 이유는 "원점에서 크기를 맞추고, 방향을 정하고, 최종 위치로 옮긴다"는 직관적인 흐름을 만들기 때문입니다.
// TRS 표준 순서
modelMatrix = T * R * S
// 잘못된 순서 예시: translation 후 rotation
// -> 이동한 위치를 기준으로 회전해 궤도 운동 같은 결과가 나옴
modelMatrix = R * T부모-자식 계층에서 행렬 누적은 자식 local에서 루트 world 방향으로 쌓인다
transform 계층에서 자식 오브젝트의 world 위치는 자식 local matrix와 부모 world matrix를 곱한 결과입니다. 이 곱셈은 "자식 local 변환 → 부모 world 변환" 순으로 적용됩니다. 손 본에 붙은 칼은 칼 자신의 local offset → 손 본의 변환 → 팔 변환 → 캐릭터 world 변환 순서로 누적됩니다. 이 사고가 없으면 자식 오브젝트를 부모 기준으로 붙였을 때 위치가 예상과 다른 원인을 찾지 못합니다.
// 계층 누적 예시
swordWorldMatrix = characterWorldMatrix
* handBoneMatrix
* swordLocalMatrix음수 scale은 행렬 determinant를 음수로 만들어 예상치 못한 결과를 낸다
행렬에 음수 scale이 포함되면 determinant가 음수가 되고, 이때 좌표계가 "뒤집힌" 상태가 됩니다. 결과적으로 cross product 방향이 반대가 되고, backface culling 판정이 뒤집혀 메시가 사라지며, normal 방향이 반전되어 조명이 이상해집니다. 특히 부모에 음수 scale이 있으면 자식 전체가 영향을 받습니다. 미러링이 필요한 경우 음수 scale 대신 별도 mirrored mesh나 rotation을 사용하는 것이 안전합니다.
// 위험한 패턴: 좌우 반전을 음수 scale로 처리
transform.scale = (-1, 1, 1)
// -> winding 뒤집힘, culling 오류, normal 반전
// 안전한 대안
// 별도 mirrored mesh 사용 또는 180도 Y rotationlocal-to-world 변환을 이해하면 카메라와 projection 변환도 같은 틀로 읽힌다
모델 행렬(local-to-world)을 이해하면 view matrix(world-to-camera)와 projection matrix(camera-to-clip)도 같은 곱셈 체계로 이어서 읽을 수 있습니다. 최종 clip space 좌표는 projection * view * model * localPos입니다. 각 행렬이 "어느 공간에서 어느 공간으로 변환하는가"를 명확히 레이블링하면, 버그를 만났을 때 어느 변환 단계가 잘못됐는지 빠르게 좁힐 수 있습니다.
clipPos = projectionMatrix * viewMatrix * modelMatrix * localPos
// clip<-view view<-world world<-local행렬 변환 순서를 읽을 때 핵심
| 상황 | 적합한 선택 |
|---|---|
| 표준 오브젝트 배치 | TRS 순서(Translation * Rotation * Scale) |
| 부모 기준 자식 배치 | 자식 local matrix → 부모 world matrix 누적 |
| 좌우 반전 구현 | 음수 scale 지양, mirrored mesh 또는 rotation 사용 |
| 변환 결과가 이상할 때 | 순서 확인 → 부모 기준 확인 → local/world 혼용 확인 |
| 카메라/projection 이해 | model → view → projection 변환 체계로 연결 |
| 회전 중심이 갑자기 멀어졌을 때 | translation과 rotation 순서가 바뀌었는지 먼저 확인 |
특이 케이스와 주의할 점
흔한 실패는 R * T와 T * R 차이를 무시해 회전 대신 궤도 운동 같은 결과를 만드는 것입니다. 행렬 버그는 숫자보다
순서와 기준 공간 문제일 때가 많습니다. 특히 음수 scale은 culling과 normal까지 함께 깨뜨리므로 조심해야 합니다.
참고 링크
2 sources