Java Android设备物理旋转读数
我试图读出android设备的物理方向,与特定的开始旋转相比较,但无论我使用什么传感器,我似乎都无法从中获得正确的旋转。我按如下方式初始化传感器:Java Android设备物理旋转读数,java,c#,android,math,android-sensors,Java,C#,Android,Math,Android Sensors,我试图读出android设备的物理方向,与特定的开始旋转相比较,但无论我使用什么传感器,我似乎都无法从中获得正确的旋转。我按如下方式初始化传感器: mySensorManager.GetDefaultSensor(SensorType.RotationVector); 我已尝试读取SensorChanged事件的“值”,如索引0、1和2上的X、Y、Z。这确实给出了一些随着我旋转设备而改变的数字,但是我似乎不知道如何获得围绕特定轴的旋转值 我正在一台平板电脑上以肖像模式进行开发。尽管平板电脑通常
mySensorManager.GetDefaultSensor(SensorType.RotationVector);
我已尝试读取SensorChanged事件的“值”,如索引0、1和2上的X、Y、Z。这确实给出了一些随着我旋转设备而改变的数字,但是我似乎不知道如何获得围绕特定轴的旋转值
我正在一台平板电脑上以肖像模式进行开发。尽管平板电脑通常处于横向模式,但这应该仍然有效。这就是为什么我相信这就是为什么它报告的读数不是简单的0,0,0,而是更像90,0,0
这不是一个容易解释的问题(部分原因是我不确定自己是否完全理解它),因此这是一个更难解决的问题。所以我提出这个问题基本上是希望有人遇到过类似的情况,也许能帮助我
或者也许只是一个3D矢量数学天才,想花几分钟在一个随机的问题上
注意:
如果设备报告的值确实报告了不同的值,这取决于它是手机还是平板电脑设备,我真的希望有一个解决方案来处理这个问题,并在所有设备上输出一个相等的值。尽管任何输入都是值得赞赏的。因此,经过大量的挖掘和Java代码的移植,我设法使用本文中的代码使其正常工作: 以下是我的SensorChanged方法的最终结果:
private float[] mGravity;
private float[] mGeomagnetic;
public void OnSensorChanged(SensorEvent e)
{
if (e.Sensor.Type == SensorType.Accelerometer)
this.mGravity = e.Values.ToArray();
if (e.Sensor.Type == SensorType.MagneticField)
this.mGeomagnetic = e.Values.ToArray();
if (this.mGravity != null && this.mGeomagnetic != null)
{
float[] R = new float[9];
float[] I = new float[9];
bool success = SensorManager.GetRotationMatrix(R, I, this.mGravity, this.mGeomagnetic);
if (success)
{
var orientation = new float[3];
SensorManager.GetOrientation(R, orientation);
var rotation = new Vector3(orientation[0], orientation[1], orientation[2]);
this.ReadingReceived?.Invoke(this, rotation);
}
}
}
查看这段代码有点过时,尽管它可能会对您有所帮助。查看传感器读数的“MainActivity”和其中用于角度计算的TimerTask(尽管此处将融合传感器读数而不是旋转矢量应用于3D模型)。