理解Android TYPE_GAME_ROTATION_VECTOR传感器四元数

时间:2018-03-18 19:14:13

标签: android unity3d rotation android-sensors quaternions

我正在尝试开发一个应用程序,我可以将手机旋转并将其发送到Unity上开发的另一个应用程序,在那里我想旋转一个3D对象以匹配我的手机的旋转。

这是我想要实现的一个例子:

https://www.youtube.com/watch?v=9lq_5B-vNGE

我遇到的问题是:我无法理解我从android应用程序中获得的四元数。

在Unity上,当我使用四元数来旋转我的3D对象时,轴不匹配。例如,当我在Y轴上旋转手机时,它会在X轴上旋转3D对象。我试图将轴重新映射到正确的轴但我无法进行。

这是我试图将四元数转换为欧拉角度,手动调整X,Y和Z并将其转换回四元数的尝试之一。结果是一个更加混乱的旋转对我来说没有意义。

//This is where I create a quaterion out of the values I get from the android phone
Quaternion myQuaternion = new Quaternion(pos.x, pos.y, pos.z, pos.w);

//This is where I transform the quaterions to Euler angles so I can adjust the angles to match the angles they should change
Vector3 myEulerAngles = myQuaternion.eulerAngles;

//This is where I create a new Vector3 trying to remap the angles
Vector3 adjustedEulerAngles = new Vector3(myEulerAngles.z, myEulerAngles.y, myEulerAngles.x); ;

//This is where I transfor the Euler angles back to quaternions
Quaternion newQuaternion = Quaternion.Euler(adjustedEulerAngles);

//This is where I set the location rotation of the object to the "adjusted" quaterion
transform.localRotation = newQuaternion;

您是否知道此代码无效的原因?如果没有,任何好的资源,我可以更好地了解如何理解Android手机发送给我的价值?

这是我在Android手机上使用的代码。这些值是TYPE_GAME_ROTATION_VECTOR传感器的结果。

public void onSensorChanged(SensorEvent sensorEvent) {
    for (int i=0; i<4; i++) {
        orientations[i] = sensorEvent.values[i];
    }
    String temp = String.valueOf(orientations[0]);
    Log.i("STATE", temp);
}

我已经检查了这个传感器上的android文档,但它没有用处:

https://developer.android.com/reference/android/hardware/Sensor.html#TYPE_GAME_ROTATION_VECTOR

我还检查了一些视频,这些视频更好地解释了旋转的工作原理:

https://youtu.be/C7JQ7Rpwn2k?t=35m32s

https://youtu.be/kYOtk5a6_x4

但是我仍然无法理解我拥有的四元数以及如何正确地将它对准3D对象。

任何建议都会非常感激,如果我在创建帖子时做错了,请告诉我,因为这是我在stackoverflow上的第一个问题。谢谢!

0 个答案:

没有答案