我有一個塔位置爲Vector2,當我足夠近時射擊一個目標。射彈應該繼續塔的位置,因爲它的起始位置,然後它得到一個目標Vector2,這是目標。射擊敵人,如何計算彈丸的下一個位置
當我知道自己的位置和目標位置加上速度時,我需要在每次更新中計算新位置時如何計算這個值?
我有一個塔位置爲Vector2,當我足夠近時射擊一個目標。射彈應該繼續塔的位置,因爲它的起始位置,然後它得到一個目標Vector2,這是目標。射擊敵人,如何計算彈丸的下一個位置
當我知道自己的位置和目標位置加上速度時,我需要在每次更新中計算新位置時如何計算這個值?
如果你有目標和原點,那麼只是做目標 - 原點給你一個新的Vector2,這是方向。然後你需要對這個方向矢量進行歸一化,並將其乘以拋射速度。
僞代碼:
Vector2 target = objectToShootAt.position();
Vector2 origin = tower.position();
Vector2 direction = target - origin;
direction.normalize(); // or direction *= 1/direction.length()
direction *= speed;
然後,只需使用方向與由幀之間的時間相乘,並且將其添加到子彈的位置。
編輯:跟進喬治的評論 中的僞我發現總是會錯過目標,如果目標移動,因爲它假定子彈不能彎曲並且不考慮目標速度。如果喬治說,子彈曲線,你需要重新計算每一幀的方向向量。
要有一個不彎曲的子彈,但要考慮到目標的速度,您需要預測目標的位置,這是通過根據目標的當前航向,速度和時間來估計目標的位置來完成的採取子彈到達那裏。
也許它會更容易通過幀更新子彈的位置,但我試圖從塔的直線方程來解決敵人的預期位置。
Equation from Enemy => Target = EnemyOrigin + EnemyDirection.Normalized * EnemySpeed * Time;
Equation from Tower => Target = TowerOrigin + BulletDirection.Normalized * BulletSpeed * Time;
Target = EO + ED * ES * T, Target = TO + BD * BS *T =>
(EO - TO) + ED * ES * T
=> EO + ED * ES * T = TO + BD * BS * T => BD = -----------------------
BS * T
現在我們不知道時間,但我們可以aproximate它,(子彈都會有不同的速度相對於距離):
Time = |(EnemyOrigen - TowerOrigen)/BulletSpeed| = |(EO - TO)/BS|;
(EO - TO)+ ED * ES * (EO - TO)/BS
=> BD = ---------------------------------------- => (+-1) * (One + (ED * ES)/BS);
BS * (EO - TO)/BS
現在我們知道了BulletDirection的BulletOrigen和飛趕工期,我們只需要插
BulletPos = TowerOrigin + BulletDirectionNormalized * BulletSpeed * TimeElapsedFromShot;
我沒有測試它,它可能不是一個很好的解決方案..但只是爲了表明其他替代...;)
既然他提到,他知道目標位置加上速度,這是值得一提的是你需要重新計算每幀(因爲目標會移動),或者做一些稍微複雜的數學來計算影響時間並相應地調整目標方向。 –