下面的代码来自Unity's tutorial on Quaternions。如果您复制/粘贴代码,它将使您的对象围绕目标飞行。我的问题是:为什么?为什么会导致此结果?当我只使用transform.RotateAround()时,为什么要这样做呢?请注意,如果您稍微更改代码,其行为将完全不同。例如,如果我将3更改为-3,则该对象就会消失。
public Transform target;
void Update()
{
Vector3 relativePos = target.position - transform.position;
Quaternion rotation = Quaternion.LookRotation(relativePos);
Quaternion current = transform.localRotation;
transform.localRotation = Quaternion.Slerp(current, rotation, Time.deltaTime);
transform.Translate(0, 0, 3 * Time.deltaTime);
}
答案 0 :(得分:1)
首先是给定的。
relativePos
是从目标到目标的向量方向。
LookRotation
是一个函数,该函数从您希望对象面对的向量中得出Quaternion
。
Slerp
在两个旋转之间进行球面内插旋转,这意味着它从给定旋转平滑地旋转到另一个旋转。
现在开始解释。
由于transform.Translate
绕着目标旋转,如果没有它,您的对象将旋转以面向目标(由于LookRotation
)在其自身轴上不动。在tranform.Translate
中,第三个参数(3 * Time.deltaTime)表示将对象沿其z轴向前移动3个单位/秒,因此它会消失,因为它一直试图在z轴上移动3个单位/秒,但是{ {1}}不断将其拉动,使其向目标旋转,因此Slerp
将其移动,而tranform.Translate
则将其旋转回到目标,从而导致绕行轨道。
您不能仅使用Slerp
,因为
transform.RotateAround()
结合使用,但是在transform.LookAt()
以上的代码上会产生一些抖动效果,而球面插值旋转实际上意味着旋转更平滑且抖动更少。Slerp
指定旋转半径该对象逃逸,因为在transform.Translate
中,第三个参数(3 * Time.deltaTime)表示将对象沿其z轴向前移动3个单位/秒,而-3则向后移动该对象,因此它逃跑了,但是如果您靠近它仍然面对目标。借助tranform.Translate
和LookRotation
功能,它沿面向目标的方向向后移动,而不是在Z轴上移动。
如果您还有其他问题/需要更多诉状,我希望这能很好地解释您的问题,我会尽快回复您。