Why is the Gyroscope inverted?

Here is a script I got online, it works pretty well I just had to make a few edits, it could be a little smoother, but still. The main problem however, is that it is completely flipped. When I tilt it upwards, it moves the camera left. When I tilt it downwards, it goes right. When I move it right, it goes up, and vice versa. Tilting works correctly though. Any help would be greatly appreciated.Thanks:

// iPhone gyroscope-controlled camera demo v0.3 8/8/11
// Perry Hoberman <hoberman@bway.net>
// Directions: Attach this script to main camera.
// Note: Unity Remote does not currently support gyroscope.
 
private var gyroBool : boolean;
private var gyro : Gyroscope;
private var rotFix : Quaternion;
public var fpc : GameObject;
 
function Start() {     
 
        Screen.orientation  = ScreenOrientation.LandscapeLeft;
 
        var originalParent = transform.parent; // check if this transform has a parent
        var camParent = new GameObject ("camParent"); // make a new parent
        camParent.transform.position = transform.position; // move the new parent to this transform position
        transform.parent = camParent.transform; // make this transform a child of the new parent
        camParent.transform.parent = originalParent; // make the new parent a child of the original parent
 
        gyroBool = Input.isGyroAvailable;
 
        if (gyroBool) {
 
                gyro = Input.gyro;
                gyro.enabled = true;
 
                if (Screen.orientation == ScreenOrientation.LandscapeLeft) {
                        camParent.transform.eulerAngles = Vector3(180,90,180);
                } else if (Screen.orientation == ScreenOrientation.Portrait) {
                        camParent.transform.eulerAngles = Vector3(90,180,0);
                }
 
                if (Screen.orientation == ScreenOrientation.LandscapeLeft) {
                        rotFix = Quaternion(0,0,0.7071,0.7071);
                } else if (Screen.orientation == ScreenOrientation.Portrait) {
                        rotFix = Quaternion(0,0,1,0);
                }              
        } else {
                print("NO GYRO");
        }
}
 
function Update () {
        if (gyroBool) {
                var camRot : Quaternion = gyro.attitude * rotFix;
                transform.localRotation = camRot;
                var direction : Vector3 = camRot * Vector3.up;
                direction.y = 0;
                gameObject.Find("print").guiText.text = direction.ToString();
                //fpc.transform.rotation = Quaternion.LookRotation(direction);
                }
}

Are you using Unity 4 ? It could be because of the following found in the 4.0 update :

I am, that could be why. However because I have no idea what that means, what should I do to change it?

For people still looking for a solution, this worked for me:

    private Gyroscope gyro;
    private Quaternion initialGyroRotation;
    private Quaternion initialRotation;
   
    void Start () {
        gyro = Input.gyro;
        gyro.enabled = true;
        initialRotation = transform.rotation;
        initialGyroRotation = Quaternion.identity;
        transform.rotation = gyro.attitude;
    }
   
    void Update () {
        #if UNITY_IOS
            Quaternion attitudeFix = new Quaternion (gyro.attitude.x, gyro.attitude.y,  gyro.attitude.z,  gyro.attitude.w);
        #elif UNITY_ANDROID
            Quaternion attitudeFix = new Quaternion (gyro.attitude.x, gyro.attitude.y, -gyro.attitude.z, -gyro.attitude.w);
        #endif
        Quaternion offsetRotation = Quaternion.Inverse (initialGyroRotation) * attitudeFix;
        transform.rotation = initialRotation * Quaternion.Euler(90.0f, 0.0f, 0.0f) * offsetRotation;
    }
1 Like