如何约束对象旋转到一定程度?

时间:2016-12-21 14:30:59

标签: c# unity3d quaternions

我有方向盘,由物理白日梦控制器控制(它的工作方式类似于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。

4 个答案:

答案 0 :(得分:3)

首先,我们需要一个我们可以实际钳制的价值。我们将从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);
}

答案 1 :(得分:2)

试试这个:

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);

答案 2 :(得分:1)

如果有人想知道我找到了一个解决方案,基于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);

答案 3 :(得分:-4)

试试这个:

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