벡터의 내적과 외적

댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.

댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
벡터 내적
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에 가까우면 적이 정면 또는 정확히 뒤쪽에 있습니다.

우리들의 게임 발매 이야기

안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다


안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다
