我使用以下代码旋转与另一个轴点相关的点:
Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles) {
Vector3 dir = point - pivot; // get point direction relative to pivot
dir = Quaternion.Euler(angles) * dir; // rotate it
point = dir + pivot; // calculate rotated point
return point;
}
如何使用协程将点旋转一段特定的持续时间,比如5秒?
答案 0 :(得分:2)
修改了other答案中的代码以获得此效果。您可以阅读它以了解lerp的工作原理。
改变了什么,为什么:
1 。通过将beginRotation
传递给角度参数并将当前对象位置传递到{{1}之外,从RotatePointAroundPivot
函数中获取Vector3.zero
点循环。这需要完成一次,因为结果将在while
循环中使用。
while
这样做是因为lerp需要一个起点。那个起点应该永远不会改变,它打破了lerp功能。
2 。在Vector3 beginRotPoint = RotatePointAroundPivot(objPoint.transform.position, pivot, Vector3.zero);
循环中生成每个帧的新角度。这是通过从while
到目标角度:
Vector3.zero
3 。找出最后的转轴角度旋转。这是通过将起点从#1 传递到第一个参数,枢轴点到第二个参数,最后是从#2 到第三个参数生成的当前角度来完成的
float t = counter / duration;
Vector3 tempAngle = Vector3.Lerp(Vector3.zero, angles, t);
4 。最后,将#3 的结果分配给Vector3 tempPivot = RotatePointAroundPivot(beginRotPoint, pivot, tempAngle);
而不是objPoint.transform.position
,因为您不仅要移动对象。你也在旋转它。
objPoint.transform.eulerAngles
完整代码:
您的objPoint.transform.position = tempPivot;
功能:
RotatePointAroundPivot
修改后的rotateObject
函数我描述了上面改变的内容:
Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles)
{
Vector3 dir = point - pivot; // get point direction relative to pivot
dir = Quaternion.Euler(angles) * dir; // rotate it
point = dir + pivot; // calculate rotated point
return point;
}
<强> USAGE 强>:
将物体在5秒内绕枢轴点旋转180度:
bool rotating = false;
IEnumerator rotateObject(GameObject objPoint, Vector3 pivot, Vector3 angles, float duration)
{
if (rotating)
{
yield break;
}
rotating = true;
Vector3 beginRotPoint = RotatePointAroundPivot(objPoint.transform.position, pivot, Vector3.zero);
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
float t = counter / duration;
Vector3 tempAngle = Vector3.Lerp(Vector3.zero, angles, t);
Vector3 tempPivot = RotatePointAroundPivot(beginRotPoint, pivot, tempAngle);
objPoint.transform.position = tempPivot;
Debug.Log("Running: " + t);
yield return null;
}
rotating = false;
}