답변:
포물선 트레이 터리 기능은 다음과 같이 정의됩니다.
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)
나는 최근에 비슷한 문제를 해결해야했다. 위키 백과 페이지 '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
필자의 경우이 솔루션은 꽤 잘 작동했습니다.
수학적으로 정확한지 신경 쓰지 않고 충분히 정확 해 보이는 경우에만 직선 경로를 계산하고 발사체가 해당 경로를 따르도록하지만 거리의 함수로 해당 선의 법선을 따라 "밀어 올리십시오" 선분의 한가운데에 가까워 질수록 선분의 한가운데에서 멀어지면서 올라갑니다.
-90에서 +90까지의 각도 범위를 사용하여 사인파를 사용할 수 있습니다 (여기서 -90은 선분의 왼쪽 점, 90은 오른쪽 점, 중간에서 뛰기). 상수를 늘려서 확장합니다.
순전히 정확한 수학 / 물리적 답변이 필요한 경우 도움이되지 않습니다. 그렇지 않다면 아마도 잘 작동 할 것입니다!
게임 프로그래밍은 사실감이 아닌 정확하고 계산하기 쉬운 환상을 사용하는 것입니다.
딱 맞는 것이 필요하고 고정 속도를 가진다면이 매우 간단한 방법을 사용할 수 있습니다.
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로 나눈 값이어야합니다.