Search code examples
c#unity-game-enginequaternions

How to constraint object rotation to certain degree?


I have steering wheel that is controlled by physical daydream controller(it works similar to wii controller). I use this code to do it:

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

I need to mess with axis, beacause default position of the controller isn't good for a steering wheel.

But in 3-axis angle between maximum rotation to the left and to the right is 180 degrees. In this range everything is fine, but if I rotate a little bit more this values change to negative and everything is messed up. What can i do to allow the player to rotate only in this range(0 - 180 on z axis of 3-axis rotation)?

EDIT: The main problem is that the values of rotation after crossing 0 or 180 change to negative values, which are the same for both, but in different order. After crossing 0 it s form -1 to -180 and and for 180 its -180 to -1.


Solution

  • Firstly, we need a value that we can actually clamp. We'll get that from the eulerAngles.z field (as a typical onscreen wheel rotates about z - you might need to change that to some other field depending on the controller):

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