- Home /
How to program for a hand-held being upside-down
I'm trying to do some trick lighting on an android device. I want to make it seem like the user is holding a real device when it comes to lighting. I'm using a Directional light and here's the code I have so far:
Quaternion rotation;
float filter = 3.0f;
Vector3 accel;
void LateUpdate () {
accel = Vector3.Lerp (accel, Input.acceleration, filter * Time.deltaTime);
rotation = Quaternion.Euler(-(accel.y*90), accel.x*90, 0);
transform.localRotation = rotation;
}
This works perfectly fine for when the device is right-side-up, but as soon as you turn the device upside-down is where it breaks. I can watch the direction of the light in the editor and instead of the light continuing to rotate, it goes back to it's original position. I know why it's happening, I just can't think of the math to fix it.
This is in portrait mode (home button on the bottom). When the device is on its left side, the y accelerometer reads 1; when it's on its right side, it reads -1. So if it's laying down, it reads zero. When I tilt to the left, it counts up to 1; if I continue tilting, it counts back down to zero. I need it to continue counting up to 2, or in the case of tilting to the right, to continue doing up to -2. So I know this has something to do with:
if (accel.z > 0) { //device is upside down
//do something other than rotation = Quaternion.Euler(-(accel.y*90), accel.x*90, 0);
}