Quick Reference
같은 Vector3라도 위치인지, 방향인지, 어느 공간 기준인지에 따라 적용할 API가 다릅니다. 부모 기준의 총구 offset처럼 위치를 옮길 때는 TransformPoint, 회전 방향만 바꿀 때는 TransformDirection, scale까지 반영한 변위에는 TransformVector를 씁니다.
Vector3 muzzleLocal = new(0f, 0.1f, 0.8f);
Vector3 muzzleWorld = character.TransformPoint(muzzleLocal); // position + rotation + scale
Vector3 aimLocal = Vector3.forward;
Vector3 aimWorld = character.TransformDirection(aimLocal); // position·scale 제외
Vector3 recoilLocal = new(0f, 0f, -0.2f);
Vector3 recoilWorld = character.TransformVector(recoilLocal); // position 제외, scale 포함| 값 | 출발 공간 -> 목적 공간 | Unity 선택 |
|---|---|---|
| 메시 정점·총구 위치·local offset | local -> world | TransformPoint |
| 바라보는 방향·forward·velocity 방향 | local -> world | TransformDirection |
| 크기를 보존해야 하는 변위·힘 | local -> world | TransformVector |
| 마우스 화면 좌표에서 world ray | screen -> world | Camera.ScreenPointToRay 등 Camera API |
공간을 이름으로 읽기
local space는 object 또는 parent 기준 공간이고, world space는 scene 공통 기준입니다. view space는 camera를 원점으로 본 공간이며, clip space는 projection 뒤 clipping에 쓰이는 homogeneous space, screen space는 pixel 또는 viewport 기준의 표시 공간입니다. 값 자체가 아니라 “이 값이 어느 공간에서 정의됐는가”가 계산의 의미를 정합니다.
mesh local --[localToWorld]--> world --[worldToCamera]--> view
view --[projection]--> clip --[viewport/rasterization]--> screen예를 들어 (0, 1, 0)은 character local에서는 character의 위지만, world에서는 씬의 위입니다. 기울어진 object에 local up force를 주려는지, 중력 반대인 world up force를 주려는지 결정하지 않으면 같은 코드가 상황에 따라 옆으로 밀리는 버그가 됩니다.
위치·방향·크기를 분리하기
TransformPoint는 position, rotation, scale을 적용합니다. TransformDirection은 position과 scale을 적용하지 않으므로 “방향만 바꿀” 때 맞습니다. TransformVector는 position은 제외하지만 scale은 적용합니다. 이 세 API를 모두 Vector3 입력이라는 이유로 바꿔 쓰면 parent scale이 있는 object에서 총구 offset·velocity·normal이 예상과 달라집니다.
world 값을 local로 되돌릴 때는 InverseTransformPoint, InverseTransformDirection, InverseTransformVector처럼 쌍이 되는 API를 사용합니다. 입력·출력 변수에 muzzleLocal, muzzleWorld처럼 공간 suffix를 붙이면 debug log와 code review에서 혼용을 빨리 찾을 수 있습니다.
카메라와 UI 경계
screen coordinate는 world position이 아닙니다. 3D scene을 클릭해 hit point를 얻으려면 screen point에서 camera ray를 만들고 physics raycast 결과의 world point를 씁니다. world marker를 UI에 올리려면 Camera.WorldToScreenPoint 결과와 Canvas의 render mode·RectTransform 변환을 함께 고려합니다. camera가 multiple이거나 overlay Canvas면 어느 camera 기준인지도 명시합니다.
공간 버그는 수학값의 오차보다 계약 누락에 가깝습니다. “local offset을 world position에 더한다”처럼 다른 공간을 바로 더하거나 dot·cross 비교를 하면 결과가 완전히 달라집니다. 같은 공간으로 변환한 뒤 계산하고, component의 scale·parent·camera 설정을 포함해 확인합니다.
TransformPoint와 TransformDirection의 차이는 이름만의 차이가 아닙니다. 전자는 위치와 scale을, 후자는 방향만 변환합니다. parent scale이 있는 씬에서는 이 선택을 잘못하면 평소에는 맞다가 특정 prefab에서만 깨질 수 있습니다.
참고 링크
2 sources