Game Dev게임 수학

벡터, 정규화, dot, cross

벡터를 위치값이 아니라 방향과 크기로 읽고, 정규화와 dot/cross를 이동·시야·판정 문제에 어떻게 연결할지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

text
heading = target - current
direction = normalize(heading)
speedVector = direction * speed

설명

  • 벡터는 점과 다릅니다. 점이 "어디에 있는가"를 나타낸다면, 벡터는 "얼마나, 어느 방향으로"를 나타냅니다. 게임에서 위치 차를 빼서 이동 방향을 만들고, 여기에 속력을 곱해 속도 벡터를 얻는 사고가 기본입니다.
  • 스칼라는 크기만 있는 값이고, 벡터는 크기와 방향을 함께 가진 값입니다. 거리, 체력, 시간은 스칼라에 가깝고, 속도, 힘, 이동 방향은 벡터에 가깝습니다. 이 구분을 먼저 잡아야 식을 읽을 때 의미가 살아납니다.
  • 정규화(normalization)는 벡터의 방향은 유지하고 길이만 1로 맞추는 과정입니다. 방향 비교나 입력 처리에서 자주 필요하지만, 길이 정보가 사라진다는 점을 이해하지 못하면 "왜 속력이 갑자기 같아졌지?" 같은 혼란이 생깁니다.
  • dot product는 두 방향이 얼마나 같은 쪽을 보는지를 수치로 바꿉니다. 정면/후면 판정, 시야각 근사, 입력 방향과 이동 방향 일치도, 조명 계산의 첫 단서가 여기에 들어 있습니다.
  • cross product는 두 벡터에 모두 수직인 방향을 만듭니다. 3D에서 오른쪽 벡터, 표면 법선(normal), 회전 축 감각을 만들 때 중요하며, "왼쪽/오른쪽 어느 쪽으로 꺾였는가"를 해석할 때도 도움이 됩니다.
  • 결국 핵심은 공식을 암기하는 것이 아니라 "지금 필요한 값이 위치인가, 방향인가, 크기인가, 각도 유사도인가, 수직축인가"를 먼저 분리하는 것입니다. 이 질문만 제대로 해도 수학 문제가 훨씬 단순해집니다.

짧은 예제

text
적이 플레이어를 바라보는지 확인:
  toPlayer = playerPos - enemyPos
  direction = normalize(toPlayer)
  facingScore = dot(enemyForward, direction)
  facingScore가 1에 가까우면 정면, 0이면 직각에 가깝다

빠른 정리

개념주로 쓰는 상황
스칼라거리, 시간, 체력처럼 크기만 필요한 값
벡터 차방향과 거리 계산
normalize방향만 남기고 크기 제거
dot정면/후면, 유사 방향, 시야 판정
cross수직 축, normal, 오른쪽 벡터 생성
magnitude거리와 속력 해석

주의할 점

dot 결과를 각도처럼 바로 읽거나, 정규화하지 않은 벡터끼리 방향 비교를 하면 판정 기준이 흔들립니다. "길이가 중요한 문제인지, 방향만 중요한 문제인지"를 먼저 나누고 필요한 경우에만 정규화하세요.

참고 링크

2 sources