3D空间抛物线抛射炮弹过靶问题求助(附物理计算代码)
3D大炮炮弹过靶问题调试建议
我在3D空间中实现大炮发射炮弹的功能,但炮弹总是显著超出目标落点。基于发射角度和落地时间,通过物理计算确定初速度:X、Z轴采用匀速直线运动公式x = v0x * cos(alpha) * t + x0,Y轴采用仅受重力的匀加速运动公式y = y0 + v0y * sin(alpha) * t - 1/2 gt^2,场景仅受重力、无空气阻力,但实际运行时炮弹始终过靶,效果异常。
以下是我的C#代码:
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)); }
调试建议
- 核对重力参数:Unity默认重力沿-Y轴(值为-9.81),确认
currentGravity取的是正数(比如9.81),同时检查炮弹Rigidbody的重力开关是否开启,自定义重力值是否和currentGravity一致,避免数值符号或大小不匹配导致竖直速度计算错误。 - 验证落地时间T:如果传入的T远小于实际所需的落地时间,会导致计算出的初速度偏大,直接让炮弹过靶。可以手动计算水平距离
distance = Vector3.Distance(new Vector3(targetPoint.x,0,targetPoint.z), new Vector3(originPoint.x,0,originPoint.z)),用平抛运动近似估算T,对比传入值是否合理。 - 检查角度定义:确认
initialAngle是炮弹与水平面的仰角,如果误设为与竖直方向的夹角,cos(angle)和sin(angle)的使用会完全颠倒,导致水平速度分量异常偏大。 - 排查Rigidbody额外设置:确保炮弹Rigidbody的
Drag和Angular Drag都设为0,没有其他脚本在运行时修改炮弹速度或施加额外力,避免这些因素干扰物理运动。 - 验算公式数值:在代码中添加调试日志,打印
vox、voz、voy、T、angle等关键值,手动代入公式验证:比如水平方向vox * Mathf.Cos(angle) * T是否等于targetPoint.x - originPoint.x,竖直方向代入公式后是否能得到目标Y值,快速定位是计算错误还是物理引擎问题。
内容的提问来源于stack exchange,提问作者Sanzor
相关产品推荐
相关产品推荐

