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