포물선 호에서 목표물을 타격하는 데 필요한 발사체의 최소 속도 계산


답변:


15

포물선 트레이 터리 기능은 다음과 같이 정의됩니다.

   Fx = Vox*t + Ox;
   Fy = -0.5 * g * t * t + Voy*t + Oy;      
  • 알려진 값 :

    P: the target point.
    O: the origin point.
    g: gravity.
    t: time needed to impact.
  • 알 수없는 값 :

    Vo: Initial Velocity
  • 'Vo'를 계산하기 위해 F 함수에 값을 제공 할 수 있습니다.

    't' = flight time  'duration' 
    'F' = target point 'P'        
    
          (Px-Ox)
    Vox = --------
          duration
    
          Py + 0.5* g * duration * duration - Oy 
    Voy = ---------------------------------------
                     duration
  • 이제 모든 값을 원점에서 목표까지 도달하여 F 방정식에 t를 입력 할 수 있습니다.

     When t = 0         => F == O (Origin)
     When t = duration  => F == P (Target)      

좋은 대답입니다. g가 서명되지 않았다는 것을 인식하십시오. g가 증가함에 따라 Voy도 증가해야합니다.
milkplus

t (충격 시간)은 어떻게 알려져 있습니까?
Dewald Swanepoel

13

나는 최근에 비슷한 문제를 해결해야했다. 위키 백과 페이지 'Dan the Man'에서 이미 언급 한 공식을 기반으로 두 가지 솔루션을 생각해 냈습니다 : 발사체의 궤도

이 솔루션에서는 발사 각도 고정 또는 x 속도 중 어느 것이 든 필요합니다. 발사체를 특정 각도로 발사 할 때 Y 속도는 필요하지 않습니다.

해결책 1, 발사 각도가 고정되어 속도를 계산하십시오.

g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity

솔루션 2, 속도가 고정되어 시작 각도를 계산하십시오.

g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle

필자의 경우이 솔루션은 꽤 잘 작동했습니다.


2

수학적으로 정확한지 신경 쓰지 않고 충분히 정확 해 보이는 경우에만 직선 경로를 계산하고 발사체가 해당 경로를 따르도록하지만 거리의 함수로 해당 선의 법선을 따라 "밀어 올리십시오" 선분의 한가운데에 가까워 질수록 선분의 한가운데에서 멀어지면서 올라갑니다.

-90에서 +90까지의 각도 범위를 사용하여 사인파를 사용할 수 있습니다 (여기서 -90은 선분의 왼쪽 점, 90은 오른쪽 점, 중간에서 뛰기). 상수를 늘려서 확장합니다.

순전히 정확한 수학 / 물리적 답변이 필요한 경우 도움이되지 않습니다. 그렇지 않다면 아마도 잘 작동 할 것입니다!

게임 프로그래밍은 사실감이 아닌 정확하고 계산하기 쉬운 환상을 사용하는 것입니다.


7
Re : "정확 해 보이는 (그리고 계산하기에 더 저렴한) 환상을 사용하는 것"은 일반적으로 동의하지만,이 경우 수학적으로 정확한 포물선을 사용하는 것이 얼마나 쉽고 저렴한 지에 대해서는 다소 어리석은 것 같습니다.
Nathan Reed

1
이것이 불필요하게 단순화 된 것처럼 보이지만,이 대답이 나쁜 의미에서 나쁜 것으로 생각하지 않으며 공감대를받을 가치가 없다고 생각합니다 (많은 공표를하지 않아도).

당신이 사인 파를 사용하려고하는 경우 사실, 그것은 (라디안 파이 또는 0) 180-0를해야한다
다니엘 카플란

2

딱 맞는 것이 필요하고 고정 속도를 가진다면이 매우 간단한 방법을 사용할 수 있습니다.

distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;

거리는 음수 일 수 있지만 각도도 거리에 의존하기 때문에 여전히 작동합니다. 거리가 음수이면 추가해야 할 각도도 음수입니다.

올바른 값을 찾으려면 distanceFactor를 가지고 놀아야합니다. 발사체의 중력과 힘에 달려 있습니다. 발사체가 덮을 수있는 최대 거리를 1로 나눈 값이어야합니다.


1
올라간다. 내가 당신의 코드를 시도했을 때, 당신은 죄와 죄를 뒤로했습니다. 코드가 정확하도록 수정했습니다.
MrValdez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.