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

Unity中如何实现无人机切换目标时旋转角度平滑过渡?

解决无人机切换目标时旋转突变的平滑过渡方案

你当前的代码直接把计算出的角度硬赋值给欧拉角,没有过渡过程,切换目标时自然会出现旋转跳变。要实现平滑旋转,核心是通过插值逐步从当前旋转过渡到目标旋转,而非直接赋值。

具体实现思路

  • 放弃直接设置欧拉角,改用四元数处理旋转(避免欧拉角的万向锁问题,插值更稳定)
  • 先计算指向目标的方向向量,基于这个方向生成目标旋转
  • 用Quaternion.Lerp或Quaternion.Slerp在每一帧中让当前旋转向目标旋转逐步靠近
  • 用速度参数控制平滑程度,结合Time.deltaTime保证帧率无关

修改后的代码示例

// 可调整的旋转速度,值越大转得越快
public float rotationSmoothSpeed = 4f;

private void Update()
{
    // 计算从无人机指向目标的方向向量,归一化后使用
    Vector3 targetDir = targetPosition - _droneTransform.localPosition;
    targetDir.Normalize();

    // 基于目标方向生成基础朝向旋转
    Quaternion targetRot = Quaternion.LookRotation(targetDir);
    
    // 替换目标旋转的俯仰(Pitch)和滚转(Roll)为你已计算好的值
    Vector3 targetEuler = targetRot.eulerAngles;
    targetEuler.x = _finalPitch;
    targetEuler.z = _finalRoll;
    targetRot = Quaternion.Euler(targetEuler);

    // 平滑插值当前旋转到目标旋转
    _droneTransform.localRotation = Quaternion.Lerp(
        _droneTransform.localRotation,
        targetRot,
        rotationSmoothSpeed * Time.deltaTime
    );
}

额外优化点

如果你的_finalPitch和_finalRoll也是动态变化的(比如切换目标时这两个值也会突变),可以对这两个值也做插值,避免俯仰/滚转的跳变:

private float _currentPitch;
private float _currentRoll;
public float rotationSmoothSpeed = 4f;

private void Update()
{
    // 先平滑过渡俯仰和滚转的值
    _currentPitch = Mathf.Lerp(_currentPitch, _finalPitch, rotationSmoothSpeed * Time.deltaTime);
    _currentRoll = Mathf.Lerp(_currentRoll, _finalRoll, rotationSmoothSpeed * Time.deltaTime);

    // 计算目标方向与旋转
    Vector3 targetDir = targetPosition - _droneTransform.localPosition;
    targetDir.Normalize();
    Quaternion targetRot = Quaternion.LookRotation(targetDir);
    
    Vector3 targetEuler = targetRot.eulerAngles;
    targetEuler.x = _currentPitch;
    targetEuler.z = _currentRoll;
    targetRot = Quaternion.Euler(targetEuler);

    // 平滑旋转朝向
    _droneTransform.localRotation = Quaternion.Lerp(
        _droneTransform.localRotation,
        targetRot,
        rotationSmoothSpeed * Time.deltaTime
    );
}

小提示

  • 如果是大角度旋转,用Quaternion.Slerp替代Lerp,球面插值的过渡会更均匀自然
  • 调整rotationSmoothSpeed的值来适配你的需求,数值越小旋转越慢越平滑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:30:42