计算球击中目标所需的初始速度

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 是:

【讨论】:

以上是关于计算球击中目标所需的初始速度的主要内容,如果未能解决你的问题,请参考以下文章

如何确定光流所需的处理器速度?

代码来验证靶区可以从初始容量与给定的升温速率来实现

球击球时改变角度

我如何在重力作用下弹回球?

先定一个小目标,参加Oracle Solaris 11.3培训,确保交付安全速度和简捷

LeetCode 1769. 移动所有球到每个盒子所需的最小操作数