You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:05:09