如何限制物体旋转到一定程度?

How to constraint object rotation to certain degree?

我有一个由物理 Daydream 控制器控制的方向盘(它的工作原理类似于 wii 控制器)。我使用这段代码来做到这一点:

void Update() {
    transform.localRotation = GvrController.Orientation;
    transform.localRotation = new Quaternion(0.0f, 0.0f, -transform.localRotation.y, transform.localRotation.w);
}

我需要弄乱轴,因为控制器的默认位置不适合方向盘。

但在 3 轴中,最大向左和向右旋转之间的角度为 180 度。在这个范围内,一切都很好,但如果我再旋转一点,这个值就会变成负数,一切都会变得一团糟。我该怎么做才能让玩家只在这个范围内旋转(3 轴旋转的 z 轴上的 0 - 180)?

编辑:主要问题是旋转值在超过 0 或 180 后变为负值,两者相同,但顺序不同。越过 0 后,它的形式为 -1 到 -180,对于 180,它的形式为 -180 到 -1。

试试这个:

If (transform.rotation > 180)
     transforn.rotation = 180;

试试这个:

if (transform.eulerAngles.z > 180)
     transform.eulerAngles = new Vector3(transform.eulerAngles.y, transform.eulerAngles.y, 180);
else if (transform.eulerAngles.z < 0)
     transform.eulerAngles = new Vector3(transform.eulerAngles.y, transform.eulerAngles.y, 0);

首先,我们需要一个可以实际限制的值。我们将从 eulerAngles.z 字段中获取(因为典型的屏幕滚轮围绕 z 旋转 - 您可能需要根据控制器将其更改为其他字段):

void Update() {

    // Get the angle:
    float angle = GvrController.Orientation.eulerAngles.z;

    // The magic - clamp it:
    if(angle < -180f){
        angle = -180f;
    }
    else if(angle > 180f){
        angle = 180f;
    }

    // Apply it as a new rotation:
    transform.localRotation = Quaternion.Euler(0f,0f,angle);
}

如果有人想知道我根据 Luke 的回答中的脚本找到了解决方案。我意识到变为负数的值很好,唯一的问题是它们是负数。所以这是工作脚本:

transform.localRotation = GvrController.Orientation;

float angle = -transform.localRotation.y;

if (angle < 0.0f) {
    angle = Mathf.Abs(angle);
}

transform.localRotation = new Quaternion(0.0f, 0.0f, angle, transform.localRotation.w);