본문 바로가기
Math

게임에서 사용하는 수학 활용 공부(2)

by Srff5123 2025. 3. 25.
728x90

1. 유클리드 기하학(Euclidean Geometry)

유클리드 기하학은 일반적으로 우리가 가장 익숙한 기하학으로, 주로 평면이나 3D 공간에서 거리, 각도 등을 계산하는데 사용된다. 벡터와 점을 기반으로 여러 기하학적 특성을 계산할 수 있다.

 

1. 거리 계산(Distance Calculation)

두 점 사이의 거리를 계산하는 공식은 피타고라스 정리를 기반으로 한다. 두 점 P1(x1, y1)와 P2(x2, y2) 사이의 유클리드 거리는 다음과 같다.

 

2D

3D

2. 각도 계산(Angle Calculation)

두 벡터 사이의 각도를 계산하는 데 주로 사용되는 공식은 내적(Dot Product)을 사용한다. 두 벡터 A(Ax, Ay, Az)와 

B(Bx, By, Bz) 사이의 각도 θ는 다음과 같이 계산한다.

여기서 A*B 는 내적을 나타내며 |A|와 |B|는 벡터의 크기이다.

 

2. 벡터 기하학(Vector Geometry)

벡터 기하학은 주로 점, 선, 평면 등을 벡터와 연산을 통해 설명한다.

 

1. 점-선 거리(Point-to-Line Distance)

점 P(x0, y0, z0)와 선 L : r(t) = A + tB (여기서 A는 선상의 한 점, B는 선의 방향 벡터) 사이의 거리는 다음과 같이 계산된다.

여기서 X 는 벡터의 외적을 의미한다.

 

2D의 경우 외적 대신 벡터의 길이를 구하는 방식으로 계산이 가능하다.

 

2D직선에서 점 P와 직선 L 사이의 거리는 다음과 같이 구할 수 있다.

1. 직선의 방정식은 Ax + By + C = 0 형태로 나타내며

점 P(x1,y1)와 직선 Ax + By + C = 0 사이의 거리는 다음 공식으로 구할 수 있다.

A, B, C는 직선의 방정식 계수

x1, y1는 점 P의 좌표

 

 

 

3D일때 직선과 점 사이의 거리

3D직선의 경우도 비슷한 방식으로 점과 직선 사이의 거리를 구할 수 있다.

3D 직선의 방정식은 다음과 같이 표현할 수 있다

A는 직선 위의 점

d는 직선의 방향 벡터

t는 파라미터

점 P와 직선 L 사이의 거리는 다음과 같이 계산할 수 있다.

여기서 P - A는 점 P와 직선 위의 점 A 사이의 벡터이며

X 는 벡터의 외적

|d| 벡터의 크기(길이)

 

2D 직선과 점 사이의 거리는 직선 방정식에서 계수를 이용해 계산하고, 외적 없이 직접적으로 점과 직선의 거리를 구할수 있다.

3D 직선과 점 사이의 거리를 외적을 사용하여 점에서 직선까지의 수직 거리를 구할 수 있다.

기하학적 계산은 게임 개발에서 충돌 감지, AI의 경로 탐색, 물리 엔진 등에서 유용하게 사용될 수 있다.

 

복습 해보는 외적 계산 방법

두 벡터 A = (Ax, Ay, Az)와 B = (Bx, By, Bz)에 대해, 외적은 다음과 같이 계산된다.

 

다음과 같은 공식으로 나타난다 ((Ay * Bz - Az * By), (Az * Bz - Az * Bz), (Az * By - Ay * Bx))

2. 평면 방정식(Plane Equation)

3D 공간에서 평면은 다음과 같은 방정식으로 나타낼 수 있다.

여기서 (A,B,C)는 평면의 법선 벡터를 나타내며, D는 평면과 원점을 연결하는 거리를 나타낸다.

평면 방정식은 벡터 연산을 사용하여 구할 수 있다. 예를 들어, 평면 위의 세 점 P1, P2, P3가 주어지면,

두 벡터 v1 = P2 - P1, v2 = P3 - P1를 사용하여 평면의 법선 벡터 n을 계산하고, 이를 평면 방정식에 적용한다.

 

해당 방정식은 평면을 정의하는데 필요한 정보를 제공하며, 법선 벡터는 평면을 정의하는 중요한 요소로, 평면에 수직인 벡터이다.

 

주어진 정보

- 평면 위의 한 점 P(x0, y0, z0)

- 평면에 수직인 법선 벡터 n = (A,B,C)

 

예시 평면 위의 점 P(1,2,3)와 법선 벡터 n = (4, -5, 6)으로 주어졌을 때, 평면 방정식을 구해보자

A = 4, B = -5, C = 6, x0 = 1, y0 = 2, z0 = 3이므로

D = -(4 * 1 + (-5) * 2 + 6 * 3) = -(4 - 10 + 18) = -12 로

 

평면 방정식은 4x -5y + 6z - 12 = 0 이다.

 

1. 두 점과 법선 벡터를 이용한 평면 방정식 구하기

두 점이 주어졌을 때, 그 두 점과 법선 벡터를 이용하면 평면 방정식을 구할 수 있다.

주어진 두점을 통해 벡터를 구하고, 그 벡터들고 법선 벡터를 구한 뒤 평면 방정식을 유도하면 된다.

 

2. 점과 평면 사이의 거리 계산

주어진 점이 평면 위에 있지 않다면, 그 점과 평면 사이의 수직 거리를 계산할 수 있다. 점과 평면 사이의 거리는 다음 공식을 사용한다.

여기서 (x1,y1,z1)는 점의 좌표, A,B,C는 평면 방정식의 계수, D는 평면 방정식의 상수항이다.

예를들어 평면 방정식이 3x - 4y + 5z - 6 = 0과 점 P(1,2,3)이 주어졌을 때, 점과 평면 사이의 거리를 구해보자

공식을 사용하여 풀어보면 점과 평면 사이의 거리는 약 0.566이라는 것을 알 수있다.

 

평면방정식은 법선 벡터와 평면 위의 점을 이용해 정의할 수 있다.

해당 방정식을 사용하면 평면을 정의하고, 점과 평면 사이의 거리도 구할 수 있어 게임 개발에서는

충돌 감지, AI 경로 탐색 등에서 활용할 수 있다.

 

3. 법선 벡터와 점을 이용한 평면 방정식 구하기

평면의 방정식을 구할 때, 법선 벡터와 평면 위의 한 점이 주어지면, 평면 방정식을 유도할 수 있다.

 

- 법선 벡터(Normal Vector)란 어떤 평면, 곡면 또는 곡선에 수직인 벡터를 의미한다. 법선 벡터는 해당 객체에 대해

수직인 방향을 정의하며, 물리학, 컴퓨터 그래픽스, 게임 개발 등에서 중요한 역할을 한다.

 

법선 벡터의 개념

- 평면에서의 법선 벡터는 평면에 수직인 벡터다. 즉, 평면 위의 모든 점과 그 평면을 가로지르는 직선들은 법선 벡터와 직각을 이루게 된다.

- 3D 그래픽스나 물리학에서, 법선 벡터는 반사, 조명 계산, 충돌 처리 등에 사용된다.

를 들어 빛이 물체에 부딪히면 법선 벡터를 이용해 반사 각도를 계산할 수 있다.

 

 

법선 벡터와 평면의 관계

- 평면 위의 모든 점은 법선 벡터와 수직인 방향에 놓인다.

- 평면의 방정식에서 A,B,C는 법선 벡터의 각 성분으로, 평면의 기울기와 방향을 정의한다.

 

법선 벡터는 두 벡터의 외적을 사용해서 구할 수 있다.

두 벡터가 주어졌을 때, 외적을 구하면 두 벡터에 수직인 벡터를 찾을 수 있다.

외적은 3D 벡터에서만 정의되므로, 두 3D 벡터가 주어졌을 때 법선 벡터를 계산할 수 있다.

 

두 점 P1(x1, y1, z1)과 P2(x2, y2, z2)이 주어졌을 때, 이 두점을 잇는 벡터들을 만들고 그 벡터들의 외적을 계산하면 평면에 수직인 법선 벡터를 구할 수 있다.

1. 두 벡터 구하기

- 벡터 v1 = (x2 - x1, y2 - y1, z2 - z1)

- 벡터 v2는 다른 벡터를 선택하여 계산 가능 (예 : 평면 위의 또 다른 점에서 구한 벡터)

두 벡터의 외적을 계산하면 법선 벡터 n을 얻을 수 있다.

 

법선 벡터 구하기 예시

1. 평면 방정식 이용

평면 방정식이 3x - 4y + 5z - 6 = 0 인 경우, 법선 벡터 n = (3, -4, 5)가 평면에 수직인 벡터이다.

2. 두 벡터의 외적 이용

A = (1,2,3) B = (4, -5, 6)가 있을 때, 이 벡터들의 외적을 계산해보자

A B 외적  = (27, 6, -13)이 나온다.

 

 

3. 충돌 판정(Collision Detection)

충돌 판정은 게임, 물리 엔진 등에서 객체 간의 충돌 여부를 판단하는 데 사용된다.

 

1. AABB(Axis-Aligned Bounding Box)

AABB는 간단하면서도 강력한 도구로, 물체나 객체를 직사각형 또는 직육면체로 둘러싸는 최소한의 경계 박스를 의미한다.

 

AABB는 축에 정렬된 직육면체로, 이 박스의 모든 면이 X,Y,Z 축에 평행한다. AABB는 두 점으로 정의된다.

최소 점(min point) : AABB의 가장 작은 좌표( 보통 좌측 하단 후면)로 가장 작은 x,y,z 값을 갖는다

최대 점(max point) : AABB의 가장 큰 좌표(보통 우측 상단 전면)로 가장 큰 x,y,z 값을 갖는다

 

이 두 점을 이용하여 AABB를 정의할 수 있다. AABB는 물체의 경계를 계산할 때 좌표 축에 대해 평행한 직육면체를 사용해 매우 빠르게 충돌 감지나 경계 계산을 수행할 수 있다.

 

 

AABB의 계산 방법

AABB는 주로 물체의 모든 점의 최솟값과 최댓값을 기반으로 계산된다.

예를 들어 3D 모델이나 물체가 있을 때, 그 물체를 둘러싸는 AABB를 구하려면 물체의 모든 점을 살펴보고,

각 축에서 최소 값과 최대 값을 찾아내면 된다.

 

3D 물체의 AABB 구하는 방법

- 물체의 각 점(vertex)을 고려하여 x,y,z 축에 대해 최소 값과 최대 값을 구합니다.

- 그 값들이 바로 AABB의 min point와 max point가 된다.

 

예시

물체의 8개의 정점이 있다고 하였을때

정점 1 (1,2,3)

정점 2 (4,5,6)

정점 3 (2,7,8)

...

이 정점들에 대해 x,y,z 값의 최소값과 최댓값을 계산하면 AABB가 정의된다.

만약 X축, Y축, Z축에 대해 각각 최솟값과 최댓값을 구했을 때

min point = 1,2,3

max point = 4,7,8이며

AABB는 1,2,3 에서 4,7,8로 정의된다.

 

1. AABB의 특성

AABB의 가장 큰 특징은 각 축에 대해 평행하게 정렬된 직육면체라는 점이다. 즉 AABB는 항상 X,Y,Z 축에 평행한다.

이 특성 때문에 AABB는 간단하고 빠르게 충돌을 감지할 수 있다.

 

AABB는 물체가 회전을 할 때에도 AABB 자체가 회전하지 않는다. 즉 AABB는 항상 축에 평행하므로 물체가 회전하면

AABB가 물체를 완전히 둘러싸지 않게 될 수 있다.

 

AABB는 2D와 3D에서 모두 사용될 수 있다. 2D에서 사용될 때 AABB는 사각형이 되고, 3D에서는 정육면체가 된다.

 

1. 2D 에서의 AABB 계산

 

두 개의 2D AABB가 주어졌을 때, AABB가 겹치는지 확인하는 방법은 각 축 (X축과 Y축)에서 최소값과 최대값을 비교하는 방식이다.

 

AABB1 (min_x1, min_y1) to (max_x1, max_y1)

AABB2 (min_x2, min_y2) to (max_x2, max_y2)

 

두 AABB가 충돌하지 않으려면 , 한 AABB가 다른 AABB의 한 축에서 완전히 벗어하는 경우이다.

 

충돌하지 않는 조건

 - AABB1의 max_x가 AABB2의 min_x보다 작으면 충돌하지 않음

 - AABB1의 min_x가 AABB2의 max_x보다 클 경우 충돌하지 않음

 - AABB1의 max_y가 AABB2의 min_y보다 작으면 충돌하지 않음

 - AABB1의 min_y가 AABB2의 max_y보다 클 경우 충돌하지 않음.

 

이 조건들을 모두 만족하지 않으면 두 AABB는 충돌한 상태이다.

 

 

 

 

 

2. 3D AABB 충돌 감지

 

- AABB1: (min_x1, min_y1, min_z1) to (max_x1, max_y1, max_z1)

- AABB2: (min_x2, min_y2, min_z2) to (max_x2, max_y2, max_z2)

 

충돌하지 않는 조건

- AABB1의 max_x가 AABB2의 min_x보다 작거나, AABB1의 min_x가 AABB2의 max_x보다 클 경우 충돌하지 않음.

- AABB1의 max_y가 AABB2의 min_y보다 작거나, AABB1의 min_y가 AABB2의 max_y보다 클 경우 충돌하지 않음.

- AABB1의 max_z가 AABB2의 min_z보다 작거나, AABB1의 min_z가 AABB2의 max_z보다 클 경우 충돌하지 않음.

 

해당 조건들이 모두 만족하지 않는 경우 두 AABB는 충돌한다.

 

 

 

그림 예시

 

 

이런식으로 비교하여 충돌 검사를 하는것이 AABB충돌이다.

3D에서는 단순히 정육면체로 z축까지 검사한다고 보면 된다.

 

 

 

728x90