내적과 정규화된 내적
내적은 두 벡터 간의 각도 관계를 표현하는 값으로, 두 벡터를 곱한 후 결과를 더하여 계산됩니다. "내적"이라는 이름은 이 연산을 나타내기 위해 자주 사용되는 중앙 점 "·"에서 유래되었습니다. 대안 이름인 "스칼라 곱"은 결과의 스칼라적 성질을 강조합니다.
수학적 공식
2D에서 벡터 a[x1, y1]와 b[x2, y2]의 내적은 다음과 같이 계산됩니다:
a · b = (x1 * x2) + (y1 * y2);
정규화된 내적
정규화된 내적은 반환 값을 -1과 1의 범위로 조정하여 계산됩니다. 이는 조명 및 기타 3D 기능을 다룰 때 특히 유용합니다.
문법
dot_product_normalised(x1, y1, x2, y2)
인수 설명
인수 | 타입 | 설명 |
---|---|---|
x1 | 숫자 | 첫 번째 벡터의 x 좌표 |
y1 | 숫자 | 첫 번째 벡터의 y 좌표 |
x2 | 숫자 | 두 번째 벡터의 x 좌표 |
y2 | 숫자 | 두 번째 벡터의 y 좌표 |
반환 값
정규화된 내적의 결과 값
예제 코드
var x1, y1, x2, y2;
x1 = lengthdir_x(1, image_angle);
y1 = lengthdir_y(1, image_angle);
x2 = o_Player.x - x;
y2 = o_Player.y - y;
if dot_product_normalised(x1, y1, x2, y2) > 0 {
seen = true;
} else {
seen = false;
}
위의 코드는 인스턴스의 이미지 각도를 사용하여 벡터를 생성하고, 플레이어 객체 "o_Player"의 벡터를 계산한 후 두 벡터의 정규화된 내적을 계산합니다. 만약 결과가 0보다 크면 변수 "seen"을 true로 설정하고, 0 이하이면 false로 설정합니다.
활용 예제
- 조명 계산: 정규화된 내적을 사용하여 광원과 표면 간의 각도를 계산하고, 이를 통해 조명 강도를 조절할 수 있습니다.
gml var light_vector = [light_x - surface_x, light_y - surface_y]; var surface_normal = [0, 1]; // 예: 수직 표면 var intensity = dot_product_normalised(light_vector[0], light_vector[1], surface_normal[0], surface_normal[1]);
- 충돌 감지: 두 객체 간의 방향성을 판단하여 충돌 여부를 결정할 수 있습니다.
gml var direction_to_target = [target.x - self.x, target.y - self.y]; var forward_vector = [1, 0]; // 객체의 전방 방향 if dot_product_normalised(forward_vector[0], forward_vector[1], direction_to_target[0], direction_to_target[1]) > 0 { // 타겟이 전방에 있음 }
- AI 시야: AI가 특정 방향으로 시야를 가지고 있는지 판단할 때 사용할 수 있습니다.
gml var ai_direction = [lengthdir_x(1, ai_angle), lengthdir_y(1, ai_angle)]; var player_direction = [player.x - ai.x, player.y - ai.y]; if dot_product_normalised(ai_direction[0], ai_direction[1], player_direction[0], player_direction[1]) > 0 { // 플레이어가 AI의 시야에 있음 }