[수학] 벡터 연산, 외적, 내적
[수학] 벡터 연산, 외적, 내적
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 라이센스를 따릅니다.