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

Unity中如何调整Vector3.Slerp执行旋转时所在的平面?

问题原因

Vector3.Slerp的旋转轴由两个输入向量的叉乘自动计算,即(start - middle) × (target - middle),你当前场景中两个点相对于middle的位置叉乘结果刚好为up轴,因此默认绕up轴旋转,无法直接通过Vector3.Slerp指定旋转平面。

解决方案

改用Quaternion.AngleAxis手动指定绕right轴旋转,逻辑更可控,修改后代码如下:

using UnityEngine;

public class Projectile : MonoBehaviour
{
    public Vector3 start;
    public Vector3 target;
    public Vector3 middle;
    // 可切换为Vector3.right使用世界right轴
    public bool useLocalRightAxis = true;
    public float flyTime;
    float launchTime;
    float totalRotateAngle;
    Vector3 startOffset;

    void Start()
    {
        launchTime = Time.time;
        // 计算起始点相对于middle的偏移
        startOffset = start - middle;
        // 计算从start到target绕right轴的总旋转角度
        Vector3 targetOffset = target - middle;
        totalRotateAngle = Vector3.SignedAngle(startOffset, targetOffset, useLocalRightAxis ? middle.right : Vector3.right);
    }

    void Update()
    {
        float percentage = Mathf.Clamp01((Time.time - launchTime) / flyTime);
        // 按百分比计算当前帧的旋转量
        Quaternion currentRotation = Quaternion.AngleAxis(totalRotateAngle * percentage, useLocalRightAxis ? middle.right : Vector3.right);
        // 旋转起始偏移后叠加middle坐标,得到当前位置
        transform.position = currentRotation * startOffset + middle;
    }
}

补充说明

如果仍要使用Vector3.Slerp实现,你需要提前将start - middle和target - middle两个向量映射到垂直于right轴的平面上,确保两者叉乘结果等于right轴,再调用Slerp即可,但该方式适配性较差,更推荐上述手动控制旋转的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:18:03