포스트

[수학] 벡터 연산, 외적, 내적

[수학] 벡터 연산, 외적, 내적

C++ 벡터 연산 정리

게임 개발에서 벡터는 방향, 거리, 위치 계산 등 다양한 곳에 사용됩니다. 이 문서에서는 벡터 정규화, 상대 위치 벡터, 내적, 외적의 개념과 활용 예를 정리합니다.


1. 벡터 정규화 (Normalization)

정규화란 벡터의 방향은 유지하되, 길이를 1로 만드는 연산입니다.

수식

\(\hat{v} = \frac{v}{\|v\|}\)

목적

  • 방향 벡터가 필요할 때 (속도와 곱해서 이동, 조준 등)
  • 내적 계산 시 각도 비교의 정확도 확보

게임에서의 활용

| 상황 | 설명 | |——|——| | 캐릭터 이동 | 방향 벡터를 정규화한 뒤 속도와 곱함 | | 에임 조준 | 총구 → 마우스 방향 계산 시 사용 | | 표면 노멀 | 조명, 반사, 물리 충돌 계산 시 필요 | | 조이스틱 입력 | 방향만 필요한 경우 정규화하여 사용 |

주의

  • 길이가 0인 벡터는 정규화할 수 없음 → 사전 체크 필요
1
2
if (v.length() > 0)
    v = v.normalized();

2. 두 물체 간의 상대 위치 벡터

정의

  • 물체 A와 B가 있을 때: \(\text{relative} = \text{A.position} - \text{B.position}\)

의미

  • 이 벡터는 B 기준에서 A까지 향하는 방향 벡터입니다.

활용

| 상황 | 설명 | |——|——| | 추적 AI | 타겟 방향 구하기 (정규화해서 이동) | | 조준 시스템 | 총알 방향 벡터 생성 | | 시야 판별 | 내 캐릭터 전방 벡터와의 각도 비교 | | 거리 계산 | relative.length()로 거리 측정 |

1
2
Vector3 dir = (targetPos - myPos).normalized();
position += dir * speed * deltaTime;

3. 내적 (Dot Product)

수식

\(\vec{a} \cdot \vec{b} = |\vec{a}||\vec{b}| \cos(\theta)\)

코드

1
float dot = a.x * b.x + a.y * b.y + a.z * b.z;

결과 해석

| 결과 | 의미 | |——|——| | > 0 | 비슷한 방향 | | < 0 | 반대 방향 | | == 0 | 수직 관계 |

게임에서의 활용

  • 시야 판별 (cosθ 기반)
  • 광원 계산 (빛 방향과 노멀 내적)
  • 유사 방향 판단
  • 각도 구하기 (acos(dot))
1
float angle = acos(dot(normalizedA, normalizedB));

4. 외적 (Cross Product)

수식

\(\vec{a} \times \vec{b} = \vec{n}\)

(a, b와 모두 수직인 벡터)

코드

1
2
3
4
5
6
7
Vector3 cross(Vector3 a, Vector3 b) {
    return {
        a.y * b.z - a.z * b.y,
        a.z * b.x - a.x * b.z,
        a.x * b.y - a.y * b.x
    };
}

의미

  • 두 벡터로 이루어진 평면에 수직인 벡터를 반환
  • 결과 벡터의 크기 = 두 벡터가 이루는 평행사변형의 넓이

게임에서의 활용

| 상황 | 설명 | |——|——| | 표면 법선 계산 | 삼각형 면의 노멀 벡터 계산 | | 회전축 계산 | 방향 벡터 사이의 회전축 구하기 | | 방향 정렬 | look-at, 회전 계산 등 |


5. 내적 vs 외적 요약 비교

항목내적 (Dot)외적 (Cross)
결과숫자 (스칼라)벡터 (수직 방향)
의미방향 유사도 (cosθ)수직 벡터 계산 (노멀 등)
용도시야 판별, 각도 계산회전축, 표면 방향, 노멀 계산
0의 의미두 벡터가 수직결과 벡터 크기가 0 (평행함)
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.