개발자공부일기
게임에서 쓰이는 삼각함수 본문
게임 서버에서 삼각함수와 역삼각함수의 활용
먼저 알아야할 개념들
삼각비와 삼각함수란?
3변중 어느 2변의 비를 삼각비라 한다. \[ \frac{a}{c}, \quad \frac{c}{a}, \quad \frac{a}{b}, \quad \frac{b}{a}, \quad \frac{b}{c}, \quad \frac{c}{b} \] 가 모두 삼각비다. 그중 우리는 중요한 3가지의 비를 sinθ,cosθ,tanθ라 한다. B= θ일때
\[ \sin \theta = \frac{높이}{빗변}, \quad \cos \theta = \frac{ 밑변 }{빗변}, \quad \tan \theta = \frac{ 높이 }{ 밑변 } \]
그리고 우린 sin,cos,tan중 하나의 값만 알아도 피타고라스정리로 나머지를 구할 수 있습니다.
이런 삼각비를 삼각형의 내각 범위를 넘어 모든 각으로 확장시킨 개념이 삼각함수다. 삼각함수는 원과 밀접한 관련이 있다. 그래서 원의 그래프를 이용해서 삼각함수 그래프를 그릴 수 있다. 그래프에 원점이 (0, 0)이고 반지름이 1인 원을 그려보자.이런 원을 단위원이라 부른다. 원의 중점에서 원 위의 한 점을 잇고, 그 점에서 x축으로 선분을 내려보자. 그럼 직각삼각형이 만들어진다.
P의 좌표는 (cosθ,sinθ)가 된다 빗변의 길이가 1이면 밑변은 cosθ, 높이는 sinθ 가 되고 모든 좌표는 (cosθ,sinθ)가 된다.
빗변의 길이가 n이면 ncosθ , nsinθ이 된다. θ와 거리(빗변의 길이)를 알면 좌표를 특정할 수 있다.
역삼각함수
역삼각함수: 삼각함수의 값을 각도로 변환하는 함수로, 특정 방향이나 각도를 계산할 때 활용됨.
- 주요 함수:
- 아크사인 (arcsin): 주어진 sin 값에 대응하는 각도를 반환.
- 아크코사인 (arccos): 주어진 cos 값에 대응하는 각도를 반환.
- 아크탄젠트 (arctan): 주어진 tan 값에 대응하는 각도를 반환.
- 아크탄젠트2 (arctan2): 두 좌표값(x, y)을 받아, 해당 점의 각도를 반환.
arctan2는 사실 atan2와 동일한 함수입니다. 일부 문서나 수학에서 arctan2라고 언급하는 경우도 있지만, 대부분의 프로그래밍 언어나 수학적 문맥에서는 atan2라는 이름으로 불립니다.
1. 아크사인 (arcsin)
- 용도: 주어진 sin 값에 대응하는 각도를 반환합니다.
- 게임 활용:
- 높이 계산: 삼각형을 이용해 물체가 상승하거나 하강하는 각도를 계산할 때 사용됩니다. 예를 들어, 발사각이 주어졌을 때 목표물까지의 높낮이를 계산하거나, 중력 영향을 받는 물체의 경로를 예측할 때 사용할 수 있습니다.
- 예시: 캐릭터가 특정 고도에서 특정 각도로 점프하는 게임에서, 점프를 위한 각도를 계산할 때 아크사인을 사용할 수 있습니다.
2. 아크코사인 (arccos)
- 용도: 주어진 cos 값에 대응하는 각도를 반환합니다.
- 게임 활용:
- 두 벡터 간의 각도 계산: 두 물체(예: 플레이어와 적) 사이의 각도를 계산할 때 사용됩니다. 이를 통해 두 객체가 서로 어느 방향을 향하고 있는지 확인할 수 있습니다.
- 예시: 플레이어와 적이 각자의 방향을 향하고 있을 때, 서로의 상대 각도를 계산하여 충돌을 감지하거나 회피 동작을 결정할 수 있습니다.
3. 아크탄젠트 (arctan)
- 용도: 주어진 tan 값에 대응하는 각도를 반환합니다.
- 게임 활용:
- 이동 방향 계산: 이동하는 물체의 방향을 계산할 때 사용됩니다. 예를 들어, 캐릭터가 일정한 방향으로 이동할 때, 현재 이동 방향의 각도를 계산하여 해당 각도로 회전시킬 수 있습니다.
- 예시: 플레이어가 마우스로 클릭한 목표 지점까지의 방향을 계산하거나, 공격이 이동할 각도를 계산할 때 유용합니다.
4. 아크탄젠트2 (arctan2)
- 용도: 두 좌표 (x, y) 값을 받아 해당 점의 각도를 반환합니다.
- 게임 활용:
- 목표 추적: 아크탄젠트2는 주로 목표물이나 적을 추적할 때 사용됩니다. 예를 들어, 플레이어가 마우스를 클릭한 지점이나 다른 캐릭터의 위치를 향해 무기나 캐릭터의 방향을 조정할 때 유용합니다.
- 예시: 적을 추적하는 미사일이나, 플레이어가 마우스를 움직여서 조준하는 FPS에서, 마우스 좌표와 플레이어의 상대적인 방향을 계산하여 회전하도록 할 수 있습니다.
- 응용:
- 플레이어가 공격 방향을 조정할 때.
- AI 캐릭터가 목표를 추적할 때.
- 물리 기반 게임에서 물체가 목표를 향해 날아가도록 설정할 때.
호도법
호도법이란 과학 등의 분야에서 정의하는 각도의 단위로 ㎭으로 표시하고, 라디안(radian)으로 읽습니다.
라디안(θ)은 호의 길이와 반지름의 길이가 같은 부채꼴의 중심각을 1로 정의하고 있습니다. 그래서 180도가 몇 라디안인지 계산해보니 3.141592... 라디안이 나왔습니다. 그래서 우린 호도법에서 180도를 𝝅라고 부르기로 했습니다.
특수각이라 부르는 각도들의 값.
스칼라 (Scalar)
스칼라는 크기만 존재하는 물리량입니다. 방향이 없으며 단순히 숫자로 표현됩니다.
예시:
- 온도: 30°C
- 질량: 5kg
- 속력: 60km/h
벡터 (Vector)
벡터는 크기와 방향을 모두 가진 물리량입니다. 보통 화살표로 표현되며 2D에서는 \( (x, y) \), 3D에서는 \( (x, y, z) \) 형태로 나타냅니다.
예시:
- 힘: 50N (동쪽)
- 속도: 60km/h (북쪽)
- 가속도: 10m/s² (아래쪽)
벡터 연산
- 벡터 덧셈: 두 벡터를 합쳐 새로운 벡터를 생성합니다.
- 벡터 뺄셈: 한 벡터에서 다른 벡터를 뺍니다.
- 스칼라 곱: 벡터의 크기를 스칼라 값만큼 늘리거나 줄입니다.
내적 (Dot Product)
내적은 두 벡터의 방향성과 크기를 기반으로 스칼라 값을 반환하는 연산입니다.
수식:
\[ \vec{a} \cdot \vec{b} = |\vec{a}| |\vec{b}| \cos\theta \]
여기서:
- \( |\vec{a}| \): 벡터 \( \vec{a} \)의 크기
- \( |\vec{b}| \): 벡터 \( \vec{b} \)의 크기
- \( \theta \): 두 벡터 사이의 각도
- 활용:
- 같은 방향일 때: cosθ가 1에 가까운 값을 가지므로, 내적은 양수가 됩니다.
- 직교할 때: cosθ가 0이므로, 내적은 0입니다.
- 반대 방향일 때: cosθ가 음수로, 내적은 음수가 됩니다.
- 사용 예시:
- 자세 추정: 두 벡터가 얼마나 비슷한 방향을 갖는지 확인하는 데 사용할 수 있습니다. 예를 들어, 로봇의 팔이나 캐릭터의 팔이 목표 방향과 일치하는지 확인할 때 유용합니다.
외적 (Cross Product)
외적은 두 벡터의 평면에 수직인 새로운 벡터를 반환하는 연산입니다.
수식 (3D 기준):
\[ \vec{A} \times \vec{B} = \begin{vmatrix} \hat{i} & \hat{j} & \hat{k} \\ A_x & A_y & A_z \\ B_x & B_y & B_z \end{vmatrix} \]
여기서 \( \hat{i}, \hat{j}, \hat{k} \)는 단위 벡터(크기가 1인 벡터 방향만을 나타냄)입니다.
크기:
\[ |\vec{u} \times \vec{v}| = |\vec{u}| |\vec{v}| \sin\theta \]
방향: 두 벡터의 평면에 수직한 방향 (오른손 법칙 사용).
외적 계산 공식:
두 벡터 A와 B의 외적은 다음과 같이 표현됩니다:
\[ \vec{A} \times \vec{B} = \begin{vmatrix} \hat{i} & \hat{j} & \hat{k} \\ A_x & A_y & A_z \\ B_x & B_y & B_z \end{vmatrix} \]
각 방향 벡터 계산:
- x 방향 벡터 ii:
\[ i = (A_y \cdot B_z) - (A_z \cdot B_y) \]
- y 방향 벡터 jj:
\[ j = (A_z \cdot B_x) - (A_x \cdot B_z) \]
- z 방향 벡터 kk:
\[ k = (A_x \cdot B_y) - (A_y \cdot B_x) \]
따라서, 외적 A × B는 다음과 같습니다:
\[
\vec{A} \times \vec{B} = \left( (A_y \cdot B_z) - (A_z \cdot B_y), (A_z \cdot B_x) - (A_x \cdot B_z), (A_x \cdot B_y) - (A_y \cdot B_x) \right)
\]
예시:
벡터 A = (1, 2, 3)과 벡터 B = (4, 5, 6)의 외적을 계산하면 다음과 같습니다.
- x 방향 벡터 i :
\[ i = (2 * 6) - (3 * 5) = 12 - 15 = -3 \]
- y 방향 벡터 j:
\[ j = (3 * 4) - (1 * 6) = 12 - 6 = 6 \]
- z 방향 벡터 k :
\[ k = (1 * 5) - (2 * 4) = 5 - 8 = -3 \]
따라서, 외적 A × B는:
\[
\vec{A} \times \vec{B} = (-3, 6, -3)
\]
내적과 외적의 차이점
특징 | 내적 | 외적 |
---|---|---|
결과 | 스칼라 | 벡터 |
의미 | 두 벡터의 방향 유사성 | 두 벡터의 평면에 수직인 벡터 |
사용 예시 | 조명 계산, 투영 | 충돌 계산, 회전 방향 |
다음은 θ와 거리(빗변의 길이)를 알고있을때 위치를 특정하는 예시입니다.
기본 수식
- 주어진 값:
- 현재 좌표: (x,y)
- 이동할 거리: d
- 이동 방향: θ\theta (라디안 단위로 표현)
- 새로운 좌표를 계산: \[ x_{\text{new}} = x + d \cdot \cos(\theta) \] \[ y_{\text{new}} = y + d \cdot \sin(\theta) \] --- 예시 1. 문제 설정 현재 좌표: \((x, y) = (3, 4)\) 이동할 거리: \(d = 5\) 이동 방향: \(\theta = \frac{\pi}{4}\) (45도) 2. 계산 \[ \cos\left(\frac{\pi}{4}\right) = \frac{\sqrt{2}}{2}, \quad \sin\left(\frac{\pi}{4}\right) = \frac{\sqrt{2}}{2} \] 새로운 좌표: \[ x_{\text{new}} = 3 + 5 \cdot \frac{\sqrt{2}}{2} \approx 3 + 3.54 \approx 6.54 \] \[ y_{\text{new}} = 4 + 5 \cdot \frac{\sqrt{2}}{2} \approx 4 + 3.54 \approx 7.54 \] 결과: \[ (x_{\text{new}}, y_{\text{new}}) \approx (6.54, 7.54) \]
코드로 구현 (JavaScript)
function calculateNewPosition(x, y, distance, angle) {
const newX = x + distance * Math.cos(angle);
const newY = y + distance * Math.sin(angle);
return { x: newX, y: newY };
}
// 예시 사용
const currentX = 3;
const currentY = 4;
const distance = 5;
const angle = Math.PI / 4; // 45도
const newPosition = calculateNewPosition(currentX, currentY, distance, angle);
console.log(newPosition); // { x: 6.54, y: 7.54 }
활용 사례
- 투사체 발사:
- 발사체의 시작 위치에서 발사체의 방향과 속력을 이용해 매 프레임마다 새 좌표를 계산.
추억속의 1945에서 원뿔형으로 나가는 저 탄막들이 각도(θ) 와 탄막의 속력을 이용해서 얻은 이동거리(d)를 삼각함수를 적용하여 x, y 좌표를 프레임마다 갱신할 수 있다.
- 발사체의 시작 위치에서 발사체의 방향과 속력을 이용해 매 프레임마다 새 좌표를 계산.
2. 현재 좌표와 이동할 좌표로 각도와 이동 거리 계산
두 좌표 \((x_1, y_1)\)와 \((x_2, y_2)\)가 주어진 경우:
1. 거리 계산:
두 점 사이의 직선 거리를 구할 때는 피타고라스 정리를 사용합니다.
\[
\text{거리} = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}
\]
이는 두 점 간의 실제 이동 거리를 나타내며, 캐릭터가 목표 지점으로 이동하거나 투사체가 목표를 향해 나아갈 때 필요합니다.
2. 각도 계산:
이동 방향의 각도를 구하려면 \(\text{atan2}\)를 사용합니다.
\[
\theta = \text{atan2}(y_2 - y_1, x_2 - x_1)
\]
- \(\text{atan2}\)는 \(y\)축과 \(x\)축의 차이를 기반으로 올바른 사분면의 각도를 반환합니다.
- 반환된 각도는 라디안 값으로, 이를 필요에 따라 각도로 변환할 수 있습니다:
\[
\text{각도} = \theta \times \frac{180}{\pi}
\]
3. 이동 벡터로 변환:
목표 좌표까지 이동할 벡터를 계산하려면 거리와 각도를 활용합니다:
\[
dx = \cos(\theta) \times \text{거리}, \quad dy = \sin(\theta) \times \text{거리}
\]
이를 통해 한 프레임 동안 캐릭터를 어느 방향으로 얼마나 이동시킬지 계산할 수 있습니다.
function calculateMovement(x1, y1, x2, y2) {
// 거리 계산
const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
// 각도 계산 (라디안 값)
const angleRadians = Math.atan2(y2 - y1, x2 - x1);
// 각도 계산 (도 단위로 변환, 필요시 사용)
const angleDegrees = angleRadians * (180 / Math.PI);
// 이동 벡터 계산
const dx = Math.cos(angleRadians) * distance;
const dy = Math.sin(angleRadians) * distance;
return {
distance,
angleRadians,
angleDegrees,
vector: { dx, dy },
};
}
// 예시 좌표
const x1 = 0, y1 = 0; // 현재 좌표
const x2 = 3, y2 = 4; // 이동할 좌표
const result = calculateMovement(x1, y1, x2, y2);
console.log(result);
3. 기울기로 좌표를 계산
기울기(각도 \(\theta\))와 이동 거리 \(d\)가 주어진 경우, 새 좌표를 계산할 수 있습니다:
1. 새 좌표 계산:
\[
x' = x + d \cdot \cos(\theta), \quad y' = y + d \cdot \sin(\theta)
\]
여기서:
- \(\cos(\theta)\)와 \(\sin(\theta)\)는 방향 벡터를 나타냅니다.
- \(d\)는 이동 거리입니다.
2. 활용 예시:
- 캐릭터가 일정한 속도로 특정 방향으로 이동하는 경우.
- AI나 투사체가 목표물을 향해 이동할 때.
---
4. 프러스텀 컬링(Frustum Culling)에서의 시야각 계산
프러스텀 컬링은 카메라 시야 밖의 오브젝트를 렌더링하지 않는 최적화 기법으로, 삼각함수를 활용하여 오브젝트가 시야 안에 있는지 판단합니다.
1. 카메라 시야각(FOV):
- 시야의 중심에서 좌우 끝까지의 각도를 삼각함수로 계산합니다.
- 예를 들어, FOV가 90도라면:
\[
\text{좌측 경계 각도} = \text{카메라 중심 각도} - \frac{\text{FOV}}{2}, \quad
\text{우측 경계 각도} = \text{카메라 중심 각도} + \frac{\text{FOV}}{2}
\]
2. 오브젝트와 카메라의 상대 각도 계산:
- 오브젝트의 좌표 \((x_o, y_o)\)와 카메라 좌표 \((x_c, y_c)\)가 주어졌을 때:
\[
\theta_o = \text{atan2}(y_o - y_c, x_o - x_c)
\]
- 이 값을 카메라 중심 각도와 비교하여 FOV 범위 내에 있는지 확인합니다.
3. 시야 안에 있는지 판단:
\[
\text{조건: } \text{좌측 경계 각도} \leq \theta_o \leq \text{우측 경계 각도}
\]
---
5. 이동 벡터(키보드)와 방향 벡터(마우스)
1. 이동 벡터:
키보드 입력으로 생성된 이동 벡터는 삼각함수로 계산됩니다.
예를 들어, WASD 입력이 다음과 같이 매핑된 경우:
- \(W: +y\) 방향
- \(S: -y\) 방향
- \(A: -x\) 방향
- \(D: +x\) 방향
이동 방향을 결정하려면 키 입력을 조합하여 방향 벡터를 계산합니다:
\[
dx = (\text{D 입력} - \text{A 입력}), \quad dy = (\text{W 입력} - \text{S 입력})
\]
2. 방향 벡터:
마우스 움직임으로 캐릭터의 회전 각도(카메라 회전) 또는 투사체의 발사 각도를 조정합니다.
예를 들어, 마우스 움직임으로 새로운 각도 \(\theta\)를 계산한 후, 이동 방향을 업데이트합니다:
\[
dx = \cos(\theta), \quad dy = \sin(\theta)
\]
---
6. 내 좌표와 오브젝트 좌표로 앞/뒤/좌/우 판별
1. 상대 벡터 계산:
오브젝트 좌표 \((x_o, y_o)\)와 내 좌표 \((x, y)\)가 주어졌을 때:
\[
\text{상대 벡터 } (dx, dy) = (x_o - x, y_o - y)
\]
2. 앞/뒤 판별:
내 방향 벡터 (예: \(v_f = (\cos(\theta), \sin(\theta))\))와 상대 벡터 \( (dx, dy)\) 간의 내적(dot product)을 계산합니다:
주인공의 정면벡터 a가 있을때 a와 상대벡터 b또는 c의
\[
\text{내적: } v_f \cdot (dx, dy) = \cos(\theta) \cdot dx + \sin(\theta) \cdot dy
\]
- 내적 값에 따른 판단:
- 내적이 양수: 두 벡터가 같은 방향을 향하고 있다는 의미입니다. 즉, 적이 캐릭터의 앞에 있다는 것을 의미합니다.
- 내적이 음수: 두 벡터가 반대 방향을 향하고 있다는 의미입니다. 즉, 적이 캐릭터의 뒤에 있다는 것을 의미합니다.
- 내적이 0: 두 벡터가 수직을 이루는 경우로, 적이 캐릭터의 옆에 있을 때입니다.
3. 좌/우 판별:
외적(cross product)을 사용하여 좌우 여부를 결정합니다:
\[
\text{외적: } v_f \times (dx, dy) = \cos(\theta) \cdot dy - \sin(\theta) \cdot dx
\]
위에서 알아본 3D외적은 너무나 어려우니 2D에서 예시를 보겠습니다.
예시 상황:
- 캐릭터의 위치 벡터 \( \mathbf{C} \)와 오브젝트의 위치 벡터 \( \mathbf{O} \)가 주어졌을 때, 이 두 벡터를 이용해 오브젝트가 좌측인지 우측인지를 판별할 수 있습니다.
- 캐릭터의 보는 방향을 나타내는 벡터 \( \mathbf{D} \)도 필요합니다. 보통 이 벡터는 캐릭터가 보는 방향을 나타내며, 예를 들어 캐릭터의 이동 방향 벡터일 수 있습니다.
단계별 설명:
벡터 정의:
\[
\mathbf{C} = (C_x, C_y) \quad \text{(캐릭터의 위치)}
\]
\[\mathbf{O} = (O_x, O_y) \quad \text{(오브젝트의 위치)}\]
\[\mathbf{D} = (D_x, D_y) \quad \text{(캐릭터의 보는 방향)}\]
위치 벡터 계산:
캐릭터와 오브젝트 간의 벡터 \(\mathbf{V} = \mathbf{O} - \mathbf{C} = (O_x - C_x, O_y - C_y)\)
캐릭터의 보는 방향 벡터 \(\mathbf{D}\)는 이미 주어졌으므로, 이를 사용합니다.
외적 계산:
두 벡터 \(\mathbf{V}\)와 \(\mathbf{D}\)의 외적을 계산하면, 두 벡터가 이루는 평면에 수직인 벡터를 얻을 수 있습니다. 2D에서 외적은 사실 스칼라 값이 나오며, 그 값의 부호로 오브젝트가 좌측에 있는지 우측에 있는지를 판별할 수 있습니다.
외적 공식:
\[
\mathbf{V} \times \mathbf{D} = (V_x \cdot D_y) - (V_y \cdot D_x)
\]
여기서,
\[\mathbf{V} = (O_x - C_x, O_y - C_y)\]
\[\mathbf{D} = (D_x, D_y)\]
결과 해석:
- 외적이 양수이면 오브젝트가 캐릭터의 왼쪽에 있습니다.
- 외적이 음수이면 오브젝트가 캐릭터의 오른쪽에 있습니다.
- 외적이 0이면 오브젝트가 캐릭터의 정면에 있습니다 (같은 직선 상에 있을 때).
---
7. 왜 삼각함수를 사용해야 하나요?
단순히 "돌리거나" "이동"하는 것만으로는 정확한 물체 위치, 방향, 시야 등을 계산할 수 없습니다. 삼각함수를 사용하는 이유는 다음과 같습니다:
1. 정확한 각도와 거리 계산
삼각함수는 두 점 간의 각도와 거리를 계산하는 데 필수적입니다. 이를 통해 상대적 위치를 정확하게 계산할 수 있습니다.
- 각도 계산: 삼각함수를 사용하면 두 벡터나 두 점 사이의 각도를 구할 수 있습니다. 예를 들어, cos와 sin 함수는 두 점이 이루는 각도를 구하는 데 사용됩니다. 이는 두 물체가 얼마나 가까운지, 또는 물체가 목표를 향하고 있는지 판단할 때 필요합니다.
- 거리 계산: 피타고라스의 정리를 활용한 삼각함수는 두 점 사이의 거리를 쉽게 계산할 수 있게 도와줍니다. 거리 계산은 이동 경로를 추적하거나 물체 간의 상호작용을 계산하는 데 중요합니다.
2. 다양한 방향 처리
360도 또는 3D 공간에서의 다양한 방향을 처리하는 데 삼각함수가 필요합니다. 삼각함수는 방향을 수학적으로 표현하고, 각도를 계산하여 벡터 간의 관계를 명확하게 파악하는 데 중요한 역할을 합니다.
- 2D에서의 방향: 2D 게임에서 물체가 북쪽, 남쪽, 동쪽, 서쪽 등 다양한 방향으로 이동할 수 있습니다. 삼각함수는 각도를 이용해 물체의 방향을 결정하고, 그에 맞는 속도 벡터를 계산하는 데 사용됩니다.
- 3D에서의 방향: 3D 공간에서는 물체가 상하, 좌우, 전후로 이동할 수 있습니다. sin, cos, tan을 사용하여 물체의 회전 각도를 계산하고, 방향 벡터를 계산할 수 있습니다. 이때 구면 좌표계나 카르테시안 좌표계를 사용하여 3D 방향을 처리합니다.
3. 효율적인 계산
내적, 외적, 거리, 각도 계산은 게임의 물리 엔진과 렌더링 시스템에서 자주 필요합니다. 삼각함수를 사용하면 이러한 계산을 효율적으로 할 수 있습니다.
- 내적 (Dot Product): 내적을 사용하여 두 벡터 간의 각도나 방향 유사성을 계산할 수 있습니다. 두 벡터의 내적을 통해 두 물체가 얼마나 비슷한 방향으로 움직이는지 판단할 수 있으며, 이 정보는 충돌 처리나 빛의 반사 등을 계산하는 데 사용됩니다.
- 외적 (Cross Product): 외적은 두 벡터가 이루는 평면에 수직인 벡터를 계산하는 데 사용됩니다. 이는 법선 벡터 계산에 유용하고, 3D 모델링에서 물체의 회전이나 충돌 검사 시 필요합니다.
- 거리 계산: 두 점 사이의 유클리드 거리를 계산하는 것은 게임에서 물체 간의 상호작용을 결정하는 데 중요합니다. 예를 들어, 충돌 감지나 AI 경로 탐색에서 중요한 역할을 합니다.
4. 3D 게임의 필요성
특히 3D 게임에서는 카메라 회전, 시야 범위, 오브젝트 간의 관계를 계산하기 위해 삼각함수가 필수적입니다.
- 카메라 회전: 3D 게임에서는 카메라가 360도 회전할 수 있으며, 카메라의 위치와 방향을 삼각함수를 통해 계산합니다. 이는 카메라가 어느 방향을 보고 있는지, 그리고 그에 맞춰 어떤 오브젝트가 화면에 나타날지를 결정하는 데 필요합니다.
- 시야 범위: 삼각함수를 사용하여 플레이어의 시야 각도를 계산하고, 이를 바탕으로 프러스텀 컬링( Frustum culling)을 구현하여 시야 밖의 오브젝트는 렌더링하지 않도록 최적화합니다.
- 물체 간의 관계: 3D 공간에서 여러 물체가 상호작용할 때, 물체의 상대적 위치, 방향, 회전 등을 계산하는 데 삼각함수를 사용합니다.
'TIL(Today I Learned)' 카테고리의 다른 글
대칭키, 비대칭키 암호화 (0) | 2025.01.08 |
---|---|
컴퓨터구조 - CPU (0) | 2025.01.06 |
버퍼와 스트림 (0) | 2025.01.02 |
Promise와 forEach의 동작 차이 (0) | 2024.12.31 |
I/O(Input/Output) 최적화 (0) | 2024.12.30 |