对物体施加力,使其以抛物线运动击中目标

问题描述 投票:0回答:1

我试图在 3D 空间中从大炮中发射炮弹,但炮弹明显超出了目标。我正在使用物理计算根据发射角度和着陆时间来确定初始速度。

问题并不那么复杂,因为在这种情况下施加的唯一力是重力,物体没有阻力。然而我一生都无法弄清楚出了什么问题。

对于我的 X 轴和 Z 轴,我使用匀速直线运动,其方程为:

x = v0x * cos(alpha) * t + x0

其中

x
是x轴上的位置,
v0x
是初始速度(我想弄清楚),
alpha
角度,
t
着陆时间和
x0
初始位置。

对于我的 Y 轴,我使用匀速加速(仅通过重力)。 主要是,

y = y0 + v0y * sin(alpha) * t - 1/2 gt^2

其中

y
是y轴位置,
y0
初始位置,
v0y
初始速度(也想弄清楚),
g
是重力。

然而,应用所有这些结果会导致非常古怪的炮弹发射......

我看过很多其他帖子,但要么他们的要求与我的不一样,要么他们使用了我几乎无法理解的不同方程。

这是代码:

void ShootCannonball(Vector3 targetPoint, Vector3 originPoint, float T)
{
    float angle = initialAngle * Mathf.Deg2Rad; // Convert to radians

    GameObject newCannonball = Instantiate(cannonballPrefab, originPoint, Quaternion.identity);
    Rigidbody rb = newCannonball.GetComponent<Rigidbody>();

    float vox = UniformMotionX(targetPoint.x, originPoint.x, angle, T);
    float voy = AcceleratedY(targetPoint.y, originPoint.y, angle, T);
    float voz = UniformMotionZ(targetPoint.z, originPoint.z, angle, T);

    Vector3 push = new Vector3(vox, voy, voz);

    // Fire!
    rb.AddForce(push, ForceMode.VelocityChange);
}    

float UniformMotionX(float target, float origin, float angle, float T)
{
    return (target - origin) / (T * Mathf.Cos(angle));
}

float AcceleratedY(float target, float origin, float angle, float T)
{
    return (target - origin + 0.5f * currentGravity * Mathf.Pow(T,2)) / (T * Mathf.Sin(angle));
}

float UniformMotionZ(float target, float origin, float angle, float T)
{
    return (target - origin) / (T * Mathf.Cos(angle));
}

问题的视频格式链接:https://imgur.com/a/8hfdvh6

感谢您给我的任何提示,如有其他需要,请询问。 在视频中你可以看到目标是好的,但总是超出目标。

c# unity-game-engine game-physics
1个回答
0
投票

我不确定我是否理解您的初始参数是什么。你到底得到了什么。

让我们以 2D 方式工作。

如果给定炮弹的位置,我们称之为

[x0, y0]
,目标的位置,我们称之为
[x1, y1]
,初速度和水平轴 Ox 之间的角度,比如
angle = a
,以及炮弹和目标之间的飞行时间
T
,那么我认为你的初始参数太多了。

如果飞行时间

T
对您来说不太重要,则仅保留
[x0, y0]
[x1, y1]
angle = a
作为初始参数。然后就可以计算出飞行时间。但如果你真的坚持飞行时间,那么你就必须放弃速度角。

案例1:
初始参数:

angle = a, [x0, y0], [x1, y1]

运动方程:

x = x0 + t*v*cos(a)

y = y0 + t*v*sin(a) - t*t*g/2

求解

t,v

x1 = x0 + t*v*cos(a)

y1 = y0 + t*v*sin(a) - t*t*g/2

求解 t 的第一个方程:

t*v = (x1 - x0)/cos(a)

t = (x1 - x0)/(v*cos(a))

将 t 代入第二个方程并求解 v:

(y1 - y0) = (x1 - x0)*sin(a)/cos(a) - g*(x1 - x0)^2/(2*v^2*cos^2(a))

g*(x1 - x0)^2/(2*v^2*cos^2(a)) = (x1 - x0)*sin(a)/cos(a) - (y1 - y0)

2*v^2*cos^2(a) / (g*(x1 - x0)^2) = 1 / ( (x1 - x0)*sin(a)/cos(a) - (y1 - y0) )

v^2 = (g*(x1 - x0)^2) / ( (x1 - x0)*sin(2*a) - 2*(y1 - y0)*cos^2(a) )

v = (x1 - x0) * sqrt( g / ( (x1 - x0)*sin(2*a) - 2*(y1 - y0)*cos^2(a) ) )

案例2: 给定飞行时间 = T, [x0, y0], [x1, y1]

x = x0 + t*v
y = y0 + t*w - t*t*g/2

求解速度 [v, w]:

x1 = x0 + T*v
y1 = y0 + T*w - T*T**g/2
v = (x1 - x0)/T
w = (y1 + T*T**g/2 - y0)/T
speed = sqrt(v*v + w*w)
cos_angle = v/speed
sin_angle = w/speed
© www.soinside.com 2019 - 2024. All rights reserved.