게임 개발에서 벡터 연산은 물리 계산, 방향 판정, 카메라 제어 등 다양한 영역에서 활용된다. 그중에서도 내적(Dot Product)과 외적(Cross Product)은 방향과 각도, 평면상의 수직 벡터 계산 등에 필수적인 연산이다. Unity는 Vector3.Dot과 Vector3.Cross 메서드를 통해 이를 간단히 계산할 수 있도록 지원한다.
정의
두 벡터 A와 B의 내적은 다음과 같이 정의된다.
A⋅B=∣A∣∣B∣cosθ
특징
Unity에서의 사용
Vector3 a = new Vector3(1, 0, 0);
Vector3 b = new Vector3(0.5f, 0.5f, 0);
float dot = Vector3.Dot(a, b); // 0.5
활용 예시
시야 판정
캐릭터 전방 벡터와 목표물 방향 벡터의 내적을 통해, 목표물이 시야각 내에 있는지 판정할 수 있다.
Vector3 forward = transform.forward.normalized;
Vector3 toTarget = (target.position - transform.position).normalized;
float dot = Vector3.Dot(forward, toTarget);
if (dot > Mathf.Cos(45f * Mathf.Deg2Rad))
{
// 시야 45도 안에 목표물이 존재
}
정면/후면 판별
내적의 부호(양수/음수)를 사용하여 상대가 앞쪽에 있는지 뒤쪽에 있는지 구분 가능하다.
정의
두 벡터 A와 B의 외적은 다음과 같이 정의된다.
A×B=∣A∣∣B∣sinθ⋅n
특징
Unity에서의 사용
Vector3 a = new Vector3(1, 0, 0);
Vector3 b = new Vector3(0, 1, 0);
Vector3 cross = Vector3.Cross(a, b); // (0, 0, 1)
활용 예시
법선 벡터 계산
3D 모델의 표면 법선을 구해 조명 계산이나 충돌 판정에 활용한다.
Vector3 v1 = p2 - p1;
Vector3 v2 = p3 - p1;
Vector3 normal = Vector3.Cross(v1, v2).normalized;
좌우 방향 판정
캐릭터 전방 벡터와 목표물 방향 벡터의 외적을 이용하여 목표물이 왼쪽에 있는지 오른쪽에 있는지 판별할 수 있다.
Vector3 forward = transform.forward;
Vector3 toTarget = target.position - transform.position;
float dir = Vector3.Cross(forward, toTarget).y;
if (dir > 0) { /* 왼쪽 */ }
else { /* 오른쪽 */ }
내적과 외적 비교
구분 | 내적 (Dot Product) | 외적 (Cross Product) |
---|---|---|
결과 타입 | 스칼라 | 벡터 |
주요 용도 | 각도 계산, 방향 비교 | 법선 계산, 수직 벡터 구하기 |
평행 여부 판정 | 1(같은 방향), -1(반대), 0(수직) | 크기 0이면 평행 |
기하학적 의미 | 크기 곱 × 방향 유사도 | 평행사변형의 넓이와 방향 |
내적과 외적은 단순한 수학 연산을 넘어, 게임 로직의 핵심적인 도구로 활용된다. 시야 판정, 조명 계산, 이동 방향 판정 등 다양한 분야에서 필수적으로 사용되며, Unity에서 제공하는 Vector3.Dot과 Vector3.Cross를 통해 간결하고 효율적으로 구현할 수 있다. 이를 정확히 이해하고 적재적소에 활용하는 것이 효율적인 게임 개발의 기반이 된다.