我试图在 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
感谢您给我的任何提示,如有其他需要,请询问。 在视频中你可以看到目标是好的,但总是超出目标。
我不确定我是否理解您的初始参数是什么。你到底得到了什么。
让我们以 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