TOOLS GAMES DEVLOG DOCS ABOUT CONTACT
HOME > DOCS > Math & Physics > 목표 지점에 도달하기 위한 포물선 투사체 발사 각도 및 초기 속도 계산
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. 탄도학 발사 벡터 계산 구현

BallisticsMath.cs
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;
    }
}

참고자료 & 관련 링크