Wojtek Wencel
Wojtek Wencel

Reputation: 2117

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.

Upvotes: 4

Views: 2856

Answers (4)

Luke Briggs
Luke Briggs

Reputation: 3789

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

Upvotes: 3

Wojtek Wencel
Wojtek Wencel

Reputation: 2117

If anyone wonders I found a solution, based on a script from Luke's answer. I realized that the values that change to negative are fine, only thing wrong with them is that they are negative. So this is the working script:

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

Upvotes: 1

Ludovic Feltz
Ludovic Feltz

Reputation: 11916

Try this:

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

Upvotes: 2

Krem Soda
Krem Soda

Reputation: 115

Try this:

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

Upvotes: -4

Related Questions