计算球击中目标所需的初始速度
Posted
技术标签:
【中文标题】计算球击中目标所需的初始速度【英文标题】:Calculate the initial velocity needed for a ball to hit a target 【发布时间】:2014-09-22 16:38:44 【问题描述】:当以下都是常数时,我如何获得子弹击中目标所需的初始速度
time to target
gravity
initial position of the ball and the target
radius of the ball
我在 Unity 3D 中使用 c# 编写了一些示例代码。我不是要代码,我只是想知道要采取哪些步骤来做到这一点(物理方面)。
【问题讨论】:
子弹击中地面所需的时间是恒定的,因为它在 y 方向的加速度是恒定的(也称为重力)。因此,它需要有足够的速度在比落地时间更短的时间内击中 x 方向的目标。 你知道目标的位置吗?查看SphereCast 如果问题与代码无关,您最好在physics.stackexchange.com 中发布这样的问题。 【参考方案1】:您的问题可以使用Kinematics 解决。您需要了解一些有关物理学的知识,但这一切都非常简单。
-
当子弹发射时,作用在子弹上的唯一力是重力。
x 轴上的加速度将为 0。
y 轴上的加速度将是重力。
让我们检查一下我们所知道的:
时间 重力 distance_to_target要计算,您将需要以下方程式:
VelocityFinal_x = VelocityInitial_x
FinalDistance_x - InitialDistance_x = VelocityInitial_x * time
VelocityFinal_y = VelocityInitial_y + gravity * time
只需重新排列第二个等式即可找到VelocityInitial_x
请注意,我们不需要使用 z 轴。除非风在飞行中移动子弹,否则不要触摸 z 轴。
确保在子弹发射的那一刻进行一次这些计算,不要在游戏的每一帧都进行。
【讨论】:
感谢您对此的帮助,我非常感谢您将其分解为如此简单易懂,只有一个问题,我了解 x 和 z 轴,但无法计算出 y ,请你给我一些关于这方面的信息。 您对 y 轴到底有什么不了解的地方? 我试着简单解释一下我使用 float velocX = (target.transform.position.x - ball.transform.position.x)/desiredTimeOfFlight; X 轴和 z 轴类似但是当我尝试向它添加重力以实现 Y 速度时,我得到的只是疯狂的数字。所以基本上我不明白如何为 y 轴添加重力 只需要使用x轴和y轴即可。 Y 速度将为V_y = Vinitial_y + gravity × time
。除非风在飞行中移动子弹,否则不要触摸 z。也只应用一次速度,而不是在每一帧中。
这是一个有趣的答案,但为了更进一步,您将如何考虑阻力?【参考方案2】:
一个很好的article on Wiki关于弹丸的轨迹,并详细解释了二维情况(如果你定义一个平面,包括弹丸的起点、目标点和重力矢量,则可以很容易地将 3D 情况简化为 2D)。
从 (0,0) 以初始速度 v 发射时,要在距离 x 和高度 y 处击中目标,所需的发射角度theta 是:
【讨论】:
以上是关于计算球击中目标所需的初始速度的主要内容,如果未能解决你的问题,请参考以下文章