벡터의 내적과 외적

벡터 내적
Dot Product
두 벡터가 얼마나 같은 방향을 향하는지 나타냅니다.
| 항목 | 내용 |
|---|---|
| 같은 방향 | 내적값이 양수입니다. |
| 수직 방향 | 내적값이 0입니다. |
| 반대 방향 | 내적값이 음수입니다. |
| 정규화된 벡터 | 결과가 -1 ~ 1 사이로 나옵니다. |
내적 계산 코드 : float 반환
float dot = Vector3.Dot(transform.forward, targetDirection.normalized);
벡터 외적
Cross Product
두 벡터에 모두 수직인 새로운 벡터를 구합니다.
| 항목 | 내용 |
|---|---|
| 방향 | 오른손 법칙으로 결정됩니다. |
| 평행한 경우 | 외적 결과가 영벡터에 가까워집니다. |
| 순서 변경 | 벡터의 순서를 바꾸면 결과 방향도 반대가 됩니다. |
외적 계산 코드 : Vector3 반환
Vector3 cross = Vector3.Cross(transform.forward, targetDirection.normalized);
| 구분 | 내적 | 외적 |
|---|---|---|
| 구하는 것 | 방향의 유사도 | 두 벡터에 수직인 방향 |
| 결과 | float | Vector3 |
| 대표 활용 | 앞뒤 판별 | 좌우 판별 |
법선 벡터
Normal Vector
표면에 수직으로 뻗어 있는 방향 벡터입니다. 표면이 어느 방향을 바라보는지 나타냅니다.
바닥의 법선 벡터 → 위쪽 방향
벽의 법선 벡터 → 벽의 바깥쪽 방향
경사면의 법선 벡터 → 경사면에 수직인 방향
외적과 법선 벡터
외적을 사용하여 법선 벡터를 구할 수 있습니다.
Vector3 edgeA = vertexB - vertexA;
Vector3 edgeB = vertexC - vertexA;
Vector3 normal = Vector3.Cross(edgeA, edgeB).normalized;
/*
법선 벡터 = 표면에 수직인 방향
외적 = 수직인 방향을 구하는 계산
외적의 결과가 법선 벡터로 사용될 수 있다.
주의 : 외적의 순서를 바꾸면 방향이 반대가 된다는 것입니다.
Vector3.Cross(a, b) == -Vector3.Cross(b, a);
*/
벡터의 내적과 외적을 활용한 적 감지 시스템 구현 방법
내적으로 앞·뒤를 판별하고, 외적으로 뒤쪽의 왼쪽·오른쪽을 판별합니다.
| 대상 위치(플레이어 기준, 적 위치) | 내적 dot | 외적 cross.y |
|---|---|---|
| 앞·오른쪽 | 양수 | 양수 |
| 앞·왼쪽 | 양수 | 음수 |
| 뒤·오른쪽 | 음수 | 양수 |
| 뒤·왼쪽 | 음수 | 음수 |
| 정확히 정면 | 1 | 0 |
| 정확히 뒤 | -1 | 0 |
감지 코드
// 플레이어에서 적을 향하는 방향
Vector3 targetDir = enemy.position - transform.position;
// 높이 차이는 무시하고, XZ 평면에서 적의 방향만 판별합니다.
targetDir.y = 0f;
// 플레이어와 적의 XZ 위치가 거의 같으면 방향 벡터가 0에 가까워집니다.
// 0에 가까운 벡터는 정규화하거나 방향 판별에 사용하기 어려우므로 계산을 중단합니다.
if (targetDir.sqrMagnitude < 0.001f)
return;
// 플레이어의 전방 방향
Vector3 forward = transform.forward;
forward.y = 0f;
forward.Normalize();
// 앞·뒤 판별
float dot = Vector3.Dot(forward, targetDir);
// dot > 0이면 적이 앞쪽, dot < 0이면 뒤쪽, dot이 0에 가까우면 옆쪽에 있습니다.
// 왼쪽·오른쪽 판별
Vector3 cross = Vector3.Cross(forward, targetDir);
// cross.y > 0이면 적이 오른쪽, cross.y < 0이면 왼쪽에 있습니다.
// cross.y가 0에 가까우면 적이 정면 또는 정확히 뒤쪽에 있습니다.
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
Develog는 단순히 글을 쓰는 공간이 아닙니다. 성장의 과정을 기록하고, 그 기록으로 나를 증명하며 원하는 기회를 얻는 곳이길 바랐습니다. 누군가의 꿈으로 향하는 중간다리가 되는 것, 그것이 Develog를 만든 이유입니다.

게임업계 취업을 준비하다 보면 조금 불편한 현실을 마주하게 됩니다. 게임회사에 들어가고 싶은 사람은 많습니다. 특히 신입 채용은 더 그렇습니다. 공고 하나에 많은 지원자가 몰리고, 회사 입장에서는 비슷한 조건의 지원자 가운데 사람을 선택할 수 있습니다. 그래서 다른 산업에서 흔히 이야기하는 “처음부터 연봉을 낮춰 부르지 마세요.” “적극적으로 협상하세요.”

우리들의 게임 발매 이야기
Develog는 단순히 글을 쓰는 공간이 아닙니다. 성장의 과정을 기록하고, 그 기록으로 나를 증명하며 원하는 기회를 얻는 곳이길 바랐습니다. 누군가의 꿈으로 향하는 중간다리가 되는 것, 그것이 Develog를 만든 이유입니다.


게임업계 취업을 준비하다 보면 조금 불편한 현실을 마주하게 됩니다. 게임회사에 들어가고 싶은 사람은 많습니다. 특히 신입 채용은 더 그렇습니다. 공고 하나에 많은 지원자가 몰리고, 회사 입장에서는 비슷한 조건의 지원자 가운데 사람을 선택할 수 있습니다. 그래서 다른 산업에서 흔히 이야기하는 “처음부터 연봉을 낮춰 부르지 마세요.” “적극적으로 협상하세요.”
