随着时间的推移围绕枢轴点旋转GameObject

时间:2017-12-13 04:54:34

标签: c# unity3d

我使用以下代码旋转与另一个轴点相关的点:

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秒?

1 个答案:

答案 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;
}