3D 내적 (Dot Product) 설명
내적은 두 벡터 간의 각도 관계를 표현하는 값으로, 두 벡터를 곱한 후 결과를 더하여 계산합니다. "내적"이라는 이름은 이 연산을 나타내기 위해 자주 사용되는 중심 점 "·"에서 유래되었습니다. 대안 이름인 "스칼라 곱"은 결과의 스칼라적 성질을 강조합니다.
수학적 공식
2D에서 벡터 a[x1, y1]와 b[x2, y2]의 내적은 다음과 같이 계산됩니다:
x1 * x2 + y1 * y2
3D에서는 벡터 a[x1, y1, z1]와 b[x2, y2, z2]의 내적은 다음과 같습니다:
x1 * x2 + y1 * y2 + z1 * z2
따라서 GameMaker에서 3D 내적은 다음과 같이 계산됩니다:
a · b = (x1 * x2) + (y1 * y2) + (z1 * z2);
내적과 각도 관계
내적은 입력 벡터 간의 각도와 다음과 같은 관계가 있습니다:
a · b = (a의 길이) * (b의 길이) * cos(각도)
즉, 두 벡터의 내적은 두 벡터 간의 각도의 코사인에 각 벡터의 길이를 곱한 값과 같습니다.
내적의 결과에 따른 관계
조건 | 내적 결과 |
---|---|
a와 b가 수직일 때 (90도) | 0 |
a와 b의 각도가 90도 미만일 때 | 양수 |
a와 b의 각도가 90도 초과일 때 | 음수 |
게임 개발에서의 활용
이 수학적 관계는 여러 상황에서 유용하게 사용될 수 있습니다. 예를 들어, 플랫폼 게임에서 적이 플레이어를 "볼 수 있는지" 확인하는 간단한 "높이" 체크를 생성할 수 있습니다. 적의 법선 벡터와 3D 바닥으로 형성된 평면 위에 플레이어가 있는지를 확인하는 것입니다.
코드 예제
아래는 적의 법선 벡터와 플레이어 간의 내적을 계산하여 플레이어가 적의 평면 위에 있는지를 확인하는 코드입니다.
var x1, y1, z1, x2, y2, z2;
x1 = 0; // 법선 벡터의 x 좌표
y1 = 1; // 법선 벡터의 y 좌표
z1 = 0; // 법선 벡터의 z 좌표
x2 = o_Player.x - x; // 플레이어와 적 간의 x 좌표 차이
y2 = o_Player.y - y; // 플레이어와 적 간의 y 좌표 차이
z2 = o_Player.z - z; // 플레이어와 적 간의 z 좌표 차이
if dot_product_3d(x1, y1, z1, x2, y2, z2) > 0 {
above = true; // 플레이어가 적의 평면 위에 있음
} else {
above = false; // 플레이어가 적의 평면 아래에 있음
}
위 코드는 인스턴스의 y 축을 따라 법선 벡터를 생성하고, 플레이어 객체 "o_Player"와 적 간의 벡터를 계산합니다. 마지막으로 두 벡터의 내적을 계산하여 결과에 따라 "above" 변수를 설정합니다.