在我的Xamarin.Android应用程序中,我具有从设备的地磁旋转矢量复合传感器获取的X,Y,Z轴方向数据,并使用SensorManager.GetOrientation()方法进行了处理。我想在CameraNode的Rotation属性的UrhoSharp场景中应用此方向数据。换句话说,我想使用设备的“方向”传感器来控制场景的摄像机。
到目前为止,我在SensorChanged事件处理程序中所做的操作:
// app -> an instance of Urho.SimpleApplication
public void OnSensorChanged(SensorEvent e) {
if (e.Sensor.Type == SensorType.GeomagneticRotationVector) {
var rm = new float[9];
SensorManager.GetRotationMatrixFromVector(rm, e.Values.ToArray());
var ov = new float[3];
SensorManager.GetOrientation(rm, ov);
app.Pitch = (Urho.MathHelper.RadiansToDegrees(ov[0]) + 360) % 360; // map [-Pi...+Pi] to [0...360]
app.Yaw = (Urho.MathHelper.RadiansToDegrees(ov[1]) + 360) % 360; // map [-Pi/2...+Pi/2] to [0...360]
app.CameraNode.Rotation = new Urho.Quaternion(app.Pitch, app.Yaw, 0);
}
}
但不幸的是,它无法按预期工作,并且相机看起来总是方向错误。任何的想法?
最后,我通过@joe的一些研究和帮助解决了它
这是方法的最终版本:
// [app] is an instance of Urho.SimpleApplication
public void OnSensorChanged(SensorEvent e) {
if (e.Sensor.Type == SensorType.GeomagneticRotationVector) {
var inR = new float[9];
SensorManager.GetRotationMatrixFromVector(inR, e.Values.ToArray());
var outR = new float[9];
// we need to remap cooridante system, since the Y and Z axes will be swapped, when we pick up the device
if (SensorManager.RemapCoordinateSystem(inR, Android.Hardware.Axis.X, Android.Hardware.Axis.Z, outR)) {
var ov = new float[3];
SensorManager.GetOrientation(outR, ov);
try {
app.Pitch = (MathHelper.RadiansToDegrees(ov[1]) + 360) % 360;
app.Yaw = (MathHelper.RadiansToDegrees(ov[0]) + 360) % 360;
app.CameraNode.Rotation = new Quaternion(app.Pitch, app.Yaw, 0);
}
catch (System.Exception ex) {
// while Urho.SimpleApplication is not fully started, the [app] properties are not available
System.Diagnostics.Trace.WriteLine(ex.Message);
}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句