如何计算transform.RotateAround的角度,所以最终结果有一个y == 0

时间:2017-06-20 17:42:37

标签: c# unity3d

所以我需要解决以下难题:

有一个带旋转的3D立方体(34,90,23)(或其他一些随机值)。我想围绕局部y轴旋转,直到transform.position.y == 0.在编辑器中我可以在y轴上拖动旋转,直到我在变换中看到0作为值,但我该怎么做用代码? (您不能只设置y = 0,因为当您围绕局部y轴旋转时所有值都会改变)

我正在考虑使用transform.RotateAround(transform.position,transform.up,angle),但我不知道如何正确计算角度,以便在RotateAround()之后transform.rotation.y == 0。

只是为了指定,我不想编写拖动本身,只是结果。轮换应该是即时的。

任何人都可以为此编写工作代码吗?

2 个答案:

答案 0 :(得分:0)

transform.eulerAngles = new Vector 3(transform.eulerAngles.x,0.0f,transform.eulerAngles.z);

如果这不起作用,请尝试使用小写字母A的eulerAngles。

这将直接将您的y值设置为0,并将其他值设置为之前的值。

答案 1 :(得分:0)

我猜你正在寻找的是一个"动画"这将影响transform.localEulerAngles.y值。要实现这一点,我建议使用协程(你可以找到Unity教程here)。

看起来像这样:

private IEnumerator RotateAroundY(float rotationTime)
{
    float timer = 0.0f;
    Vector3 startLocalEulerAngles = transform.localEulerAngles;
    Vector3 deltaLocalEulerAngles = new Vector3(0.0f, Mathf.DeltaAngle(startLocalEulerAngles.y, 0.0f), 0.0f);

    while (timer < rotationTime)
    {
        timer += Time.deltaTime;
        transform.localEulerAngles = startLocalEulerAngles + deltaLocalEulerAngles * (timer / rotationTime);
        yield return new WaitForEndOfFrame();
    }

    transform.localEulerAngles = startLocalEulerAngles + deltaLocalEulerAngles;
}

您可以使用StartCoroutine(RotateAroundY(4.0f));调用它。

如果您要进入Unity,我强烈建议您熟悉协同程序:)

编辑:
很抱歉没有注意到您不需要动画:如果您只想围绕本地transform.up向量进行旋转,则可以更改transform.localEulerAngles.y值。

你可以这样做transform.localEulerAngles.y = new Vector3(transform.localEulerAngles.x, 0.0f, transform.localEulerAngles.z);

希望这有帮助,