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
相关产品推荐
相关产品推荐

