Android 设备物理旋转读数
Android Device Physical Rotation readings
我正在尝试读出 android 设备与特定开始旋转相比的物理方向,但无论我使用什么传感器,我似乎都无法从中获得正确的旋转采用。我这样初始化传感器:
mySensorManager.GetDefaultSensor(SensorType.RotationVector);
我已经尝试将 SensorChanged 事件的 'Values' 读取为索引 0、1 和 2 上的 X、Y、Z。这确实给出了一些随着我旋转设备而改变的数字,但是我可以'似乎弄清楚如何获得围绕特定轴的旋转值
我正在纵向模式下的平板电脑上开发。这应该仍然有效,即使平板电脑通常处于横向模式。这就是为什么我被引导相信这就是为什么它报告的读数不是简单的 0,0,0,而更可能是 90,0,0。
这不是一个容易解释的问题(部分原因是我什至不确定我是否完全理解它),因此是一个更难解决的问题。所以基本上我提出这个问题是希望有人遇到过类似的情况,并且可以帮助我。
或者可能只是一个 3D 矢量数学天才,想花几分钟来解决一个随机问题。
注:
如果设备报告的值确实报告了不同的值,这取决于它是 phone 还是平板设备,我真的很感激能够处理这个问题并输出一个相等的值的解决方案所有设备。当然,任何意见都值得赞赏。
所以经过大量的挖掘和一些 Java 代码的移植,我设法使用这篇博文中的代码让它工作:Using orientation sensors: Simple Compass sample
这是我的 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);
}
}
}
我正在尝试读出 android 设备与特定开始旋转相比的物理方向,但无论我使用什么传感器,我似乎都无法从中获得正确的旋转采用。我这样初始化传感器:
mySensorManager.GetDefaultSensor(SensorType.RotationVector);
我已经尝试将 SensorChanged 事件的 'Values' 读取为索引 0、1 和 2 上的 X、Y、Z。这确实给出了一些随着我旋转设备而改变的数字,但是我可以'似乎弄清楚如何获得围绕特定轴的旋转值
我正在纵向模式下的平板电脑上开发。这应该仍然有效,即使平板电脑通常处于横向模式。这就是为什么我被引导相信这就是为什么它报告的读数不是简单的 0,0,0,而更可能是 90,0,0。
这不是一个容易解释的问题(部分原因是我什至不确定我是否完全理解它),因此是一个更难解决的问题。所以基本上我提出这个问题是希望有人遇到过类似的情况,并且可以帮助我。
或者可能只是一个 3D 矢量数学天才,想花几分钟来解决一个随机问题。
注:
如果设备报告的值确实报告了不同的值,这取决于它是 phone 还是平板设备,我真的很感激能够处理这个问题并输出一个相等的值的解决方案所有设备。当然,任何意见都值得赞赏。
所以经过大量的挖掘和一些 Java 代码的移植,我设法使用这篇博文中的代码让它工作:Using orientation sensors: Simple Compass sample
这是我的 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);
}
}
}