Math & Physics
Intermediate
Unity 2021.3+ / Unity 6
목표 지점에 도달하기 위한 포물선 투사체 발사 각도 및 초기 속도 계산
중력 가속도(g)와 고도차(h)가 존재하는 3D/2D 환경에서 목표 좌표(Target)를 정확히 명중시키기 위한 2차 방정식 탄도학 수식 풀이.
#Math #Physics #Ballistics #Trajectory #Gameplay
핵심 개념수류탄 투척이나 곡사포 발사 시 원하는 목표 지점에 투사체가 떨어지게 하려면 중력 방정식 $y = v_y t - \frac{1}{2}gt^2$와 $x = v_x t$를 연립해야 합니다. 속도 크기 $v$가 고정되었을 때 발사각 $\theta$를 역추적하는 공식입니다.
1. 탄도학 발사 벡터 계산 구현
using UnityEngine;
public static class BallisticsMath
{
/// <summary>
/// 고정된 발사 속도로 목표점에 도달하기 위한 발사 벡터를 반환합니다.
/// </summary>
public static bool TryCalculateLaunchVelocity(
Vector3 start, Vector3 target, float speed, float gravity, out Vector3 velocity)
{
velocity = Vector3.zero;
Vector3 diff = target - start;
Vector3 diffXZ = new Vector3(diff.x, 0f, diff.z);
float x = diffXZ.magnitude;
float y = diff.y;
float v2 = speed * speed;
float v4 = v2 * v2;
float g = Mathf.Abs(gravity);
float underSqrt = v4 - g * (g * x * x + 2f * y * v2);
if (underSqrt < 0f) return false; // 사거리 부족 (도달 불가)
float sqrtTerm = Mathf.Sqrt(underSqrt);
// 저각 탄도 (직사)
float angle = Mathf.Atan((v2 - sqrtTerm) / (g * x));
Vector3 dirXZ = diffXZ.normalized;
velocity = dirXZ * (speed * Mathf.Cos(angle)) + Vector3.up * (speed * Mathf.Sin(angle));
return true;
}
}