下面的代码来自Unity的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);
}
首先是给定的。
relativePos
是从目标到目标的向量方向。LookRotation
是一个函数,该函数Quaternion
从您希望对象面向的向量中得出。Slerp
在两个旋转之间进行球面内插旋转,这意味着它从给定旋转平滑地旋转到另一个旋转。
现在开始解释。
它绕着目标旋转,因为transform.Translate
没有它,您的对象将旋转以面向目标(由于LookRotation
)而在其自身的轴上不动。在tranform.Translate
第三个参数中(3 * Time.deltaTime)表示将对象沿其z轴向前移动3个单位/秒,因此它会退出,因为它一直试图在z轴上移动3个单位/秒,但Slerp
一直在拉动它朝目标旋转,因此tranform.Translate
将其移动并Slerp
保持旋转回目标,从而导致绕轨道运动。
而且你不能仅仅transform.RotateAround()
因为
transform.LookAt()
但会在上面的代码中产生一些抖动效果,而在上面的代码中,Slerp
球面插值旋转实际上意味着旋转更平滑且抖动更少。transform.Translate
该对象tranform.Translate
逃逸是因为在第三个参数(3 * Time.deltaTime)中表示沿其z轴向前移动对象3个单位/秒,而-3意味着向后移动该对象因而因此逃跑了,但是如果您靠近它,它仍然面向目标。由于LookRotation
和Slerp
功能,它没有沿Z轴向后移动,而是沿面向目标的方向向后移动。
如果您还有其他疑问/需要更多解决方法,我希望这能很好地解释您的问题,我会尽快回复您。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句