devNotes 1-3-2017 Quaternion 3DOF Flight Rotations

 

using UnityEngine;
using System.Collections;

public class Controller_Rotations : MonoBehaviour
{
    Quaternion curr_Rotation_1 = Quaternion.identity;
    Quaternion curr_Rotation_2 = Quaternion.identity;

    public GameObject Ctrl;
    public float rota_Rate_1;
    public float rota_Rate_2;

    private float x_Rota;
    private float y_Rota;
    private float z_Rota;

    private HMD_Ctrl_Tracking hmd_Ctrl_Tracking;

    void Start ()
    {
        hmd_Ctrl_Tracking = HMD_Ctrl_Tracking.Instance;
	}
	
	void Update ()
    {
        if (hmd_Ctrl_Tracking.isCtrl_1_Active() && hmd_Ctrl_Tracking.isCtrl_2_Active())
        {
            Quaternion qI =
            Quaternion.Inverse(HMD_Ctrl_Tracking.Instance.getSteamVR_PlayArea().transform.rotation)
            * Ctrl.transform.rotation;

            curr_Rotation_1 = Quaternion.Slerp(curr_Rotation_1, qI, rota_Rate_1 * Time.deltaTime);
            curr_Rotation_2 = Quaternion.Slerp(curr_Rotation_2, qI, rota_Rate_2 * Time.deltaTime);

            Quaternion diffQ = Quaternion.Inverse(curr_Rotation_1) * curr_Rotation_2;
            Vector3 euler = diffQ.eulerAngles;

            x_Rota = euler.x;
            y_Rota = euler.y;
            z_Rota = euler.z;

            pollish_rota(ref x_Rota);
            pollish_rota(ref y_Rota);
            pollish_rota(ref z_Rota);
        }
    }

    private void pollish_rota(ref float rota)
    {
        if (rota > 180)
        {
            rota = rota - 360;
        }
    }


    public float get_x_Rota()
    {
        return x_Rota;
    }

    public float get_y_Rota()
    {
        return y_Rota;
    }

    public float get_z_Rota()
    {
        return z_Rota;
    }
}

18bdw01a