using UnityEngine;
using System;
using System.Collections;
using System.Runtime.InteropServices;
public class GetRToCameraFromSO : MonoBehaviour {
[DllImport("Sensor")]
private static extern int getQuat(IntPtr ptr_sensor);
[DllImport("Sensor")]
private static extern int initManager();
[DllImport("Sensor")]
private static extern int unitManager();
private IntPtr mSensorPtr;
public Transform mchildTrans;
private const int SENSORPTRCOUNT = 9;
// Use this for initialization
void Start () {
mSensorPtr = Marshal.AllocHGlobal(SENSORPTRCOUNT * sizeof(float));
Input.gyro.enabled = true;
GetRToCameraFromSO.initManager();
}
// Update is called once per frame
void Update () {
float[] sensorArr = new float[SENSORPTRCOUNT];
GetRToCameraFromSO.getQuat(mSensorPtr);
Marshal.Copy(mSensorPtr, sensorArr, 0, SENSORPTRCOUNT);
/** 四元数 */
Quaternion quat = new Quaternion(sensorArr[0], sensorArr[1], sensorArr[2], sensorArr[3]);
/** 矩阵 */
//Matrix4x4 matrix4 = new Matrix4x4();
//matrix4.SetRow(0, new Vector4(sensorArr[0], sensorArr[1], sensorArr[2], 0));
//matrix4.SetRow(1, new Vector4(sensorArr[3], sensorArr[4], sensorArr[5], 0));
//matrix4.SetRow(2, new Vector4(sensorArr[6], sensorArr[7], sensorArr[8], 0));
//matrix4.SetRow(3, new Vector4(0, 0, 0, 1));
//Quaternion quat = GetRotation(matrix4);
/** 欧拉角 */
transform.rotation = quat;
mchildTrans.rotation = quat;
}
/// <summary>
/// 矩阵阵中提取旋转量
/// </summary>
/// <param name="matrix">RTS矩阵</param>
/// <returns>旋转四元数</returns>
public static Quaternion GetRotation(Matrix4x4 matrix)
{
float qw = Mathf.Sqrt(1f + matrix.m00 + matrix.m11 + matrix.m22) / 2;
Debug.Log("GetRotation " + qw + ", " + matrix.m00 + ", " + matrix.m11 + ", " + matrix.m22);
float w = 4 * qw;
float qx = (matrix.m21 - matrix.m12) / w;
float qy = (matrix.m02 - matrix.m20) / w;
float qz = (matrix.m10 - matrix.m01) / w;
return new Quaternion(qx, qy, qz, qw);
}
}
把libSensor.so放到Assets/Plugins/Android/libs/armeabi-v7a/libSensor.so 即可