Quick Reference
text
position B - position A -> A에서 B로 향하는 displacement
normalize(displacement) -> 길이 1인 direction
direction * speed -> units/second인 velocity
velocity * deltaTime -> 이번 frame의 movement벡터의 숫자만 보고 의미를 알 수 없습니다. 위치끼리 더하기보다 도착 위치 - 현재 위치, 방향에는 길이 1, 속도에는 시간당 단위를 명시합니다.
| 의미 | 단위·특징 | 대표 연산 |
|---|---|---|
| Position | 기준점에서의 위치 | 두 position의 차이는 displacement |
| Direction | 보통 길이 1 | dot·cross와 회전 |
| Velocity | distance / second | position += velocity * dt |
| Force | mass · acceleration | 물리 적분기에 전달 |
| Surface normal | 표면에 수직인 direction | lighting·backface 판정 |
| Light direction | 빛 진행 또는 표면에서 빛 방향 | renderer가 부호 계약을 고정 |
길이와 정규화
csharp
Vector3 delta = target.position - transform.position;
if (delta.sqrMagnitude > 0.000001f)
{
Vector3 direction = delta.normalized;
transform.position += direction * speed * Time.deltaTime;
}정규화는 방향을 유지하면서 길이를 1로 만듭니다. 영벡터는 방향이 없으므로 나누기 전에 길이를 확인합니다. 거리의 대소만 비교할 때는 square root가 없는 sqrMagnitude와 제곱된 기준값을 비교할 수 있습니다.
Normal도 방향 벡터지만 표면에 수직이라는 추가 의미가 있습니다. 비균등 scale 아래에서는 일반 direction과 같은 방식으로 변환하면 수직 관계가 깨질 수 있어 inverse-transpose normal matrix를 사용합니다.
방향 사이의 각도와 면 방향은 내적과 외적, 공간 변환은 행렬과 Transform 합성에서 이어서 확인합니다.
자주 틀리는 점
direction * deltaTime만 사용해 speed 단위를 빠뜨리지 않습니다.- Frame마다 위치에 고정값을 더해 frame rate에 따라 속도가 달라지지 않게 합니다.
- Position을 normalize해 원점에서의 방향으로 바꾸지 않습니다.
magnitude와sqrMagnitude를 서로 다른 단위의 기준값과 비교하지 않습니다.
참고 링크
1 sources