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

如何发射沿弧形曲线轨迹飞行的抛射体以命中预定目标?

Line Example

抛射体拱形轨迹实现思路

你要的拱形轨迹本质就是抛物线运动,分两种主流实现方式,按需选就行:

  • 物理引擎模拟方案(适合带物理系统的开发引擎,Unity/Unreal/Cocos都适用)
    核心是用重力和初速度模拟真实抛射运动,要求必须命中目标的话可以先反推初速度参数,避免打偏:

    // 提前计算初始参数
    float g = 9.8f; // 重力值,可按需调整大小
    Vector2 start = 抛射体生成位置;
    Vector2 target = 目标位置;
    float totalFlyTime = 1.2f; // 自定义抛射体从起点到终点的总飞行时长
    // 反推水平、竖直方向的初速度
    float vx = (target.x - start.x) / totalFlyTime;
    float vy = (target.y - start.y + 0.5 * g * totalFlyTime * totalFlyTime) / totalFlyTime;
    
    // 每帧更新位置逻辑
    float timePassed = 从抛射开始经过的时间;
    float currentX = start.x + vx * timePassed;
    float currentY = start.y + vy * timePassed - 0.5 * g * timePassed * timePassed;
    抛射体.transform.position = new Vector2(currentX, currentY);
    

    要是不需要严格命中目标,直接给抛射体加刚体组件、开重力、赋予一个斜向上的初速度就行,引擎会自动算轨迹。

  • 贝塞尔曲线模拟方案(无物理引擎也能用,轨迹完全可控,性能更高)
    用二阶贝塞尔曲线直接生成拱形路径,三个控制点分别是起点、拱形顶点、终点,顶点高度可以自己调整:

    // 计算贝塞尔中间顶点
    Vector2 start = 抛射体生成位置;
    Vector2 target = 目标位置;
    // 中间顶点取两点中点向上偏移,偏移量可以按距离动态调整,效果更自然
    Vector2 mid = (start + target) / 2;
    mid.y += 两点距离 * 0.3f; // 系数越大拱越高
    
    // 每帧按时间进度取点
    float t = 从抛射开始经过的时间 / 总飞行时长; // t范围0~1
    float u = 1 - t;
    Vector2 currentPos = u*u*start + 2*u*t*mid + t*t*target;
    抛射体.transform.position = currentPos;
    

    需要抛射体头部朝向运动方向的话,每帧计算当前点和上一帧点的差值,赋值给旋转角度即可。

小提示:如果有碰撞检测需求,每帧更新位置后先判断是否接触到目标,接触就直接触发命中逻辑,不用跑完整个飞行周期。

内容的提问来源于stack exchange,提问作者Calextone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:09:01