기본 패턴
text
modelMatrix = translation * rotation * scale
worldPosition = modelMatrix * localPosition설명
- 행렬은 여러 변환을 하나의 계산 흐름으로 묶어 주는 도구입니다. 이동, 회전, 크기 변형을 각각 따로 생각하던 것을 한 번의 곱셈 체계로 정리할 수 있기 때문에 3D 그래픽스와 transform 시스템의 중심에 놓입니다.
- 중요한 것은 행렬 자체보다 곱하는 순서입니다. scale 후 rotation 후 translation을 할지, translation 뒤에 rotation을 할지에 따라 결과는 달라집니다. 그래서 행렬 문제는 값이 아니라 순서 문제로 읽는 습관이 중요합니다.
- local-to-world 변환을 이해하면, 모델 내부 좌표로 정의된 점이 월드에서 어디에 놓이는지 설명할 수 있습니다. 이 사고가 있어야 본격적인 camera/view/projection 변환도 자연스럽게 연결됩니다.
- 초보자가 흔히 하는 실수는 "이동, 회전, 크기 변형은 서로 독립적이니 순서는 중요하지 않다"고 보는 것입니다. 실제로는 회전 기준점, 크기 변형 중심, 부모-자식 계층이 모두 순서의 영향을 받습니다.
- 행렬 카드는 공식을 많이 적는 카드보다, "지금 내가 적용하는 변환은 누구 기준인가"와 "왜 이 순서여야 하는가"를 설명하는 카드가 더 오래 갑니다. 게임 엔진 transform hierarchy도 결국 이 문제를 감춰서 도와주는 인터페이스입니다.
짧은 예제
text
칼 모델의 local 좌표에 손잡이 기준이 있다
캐릭터 손 본에 붙을 때는
local sword transform
-> hand bone transform
-> character world transform
순서로 누적된다빠른 정리
| 항목 | 핵심 포인트 |
|---|---|
| translation | 위치를 옮긴다 |
| rotation | 방향과 기준축을 바꾼다 |
| scale | 크기를 바꾼다 |
| 곱셈 순서 | 결과 위치와 기준점이 달라진다 |
| local-to-world | 로컬에서 정의한 점을 월드에 배치한다 |
주의할 점
행렬 문제를 숫자 계산 실수로만 보면 디버깅이 잘 안 됩니다. 결과가 이상하면 먼저 "순서가 맞는가", "부모 기준인가", "로컬 값을 월드 값처럼 읽고 있지 않은가"를 점검하세요.
참고 링크
2 sources