首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于安卓设备定位的Xamarin.Android与UrhoSharp摄像机节点旋转

基于安卓设备定位的Xamarin.Android与UrhoSharp摄像机节点旋转
EN

Stack Overflow用户
提问于 2018-05-11 10:53:55
回答 3查看 396关注 0票数 1

在我的Xamarin.Android应用程序中,我从设备的地磁旋转矢量复合传感器中获得了X、Y、Z轴的方位数据,并用SensorManager.GetOrientation( )方法进行了处理。我想把这些定位数据应用到UrhoSharp的场景中,旋转属性的CameraNode,换句话说,我想要控制现场的相机使用设备的“方位”传感器。

到目前为止,我在SensorChanged事件处理程序中所做的工作:

代码语言:javascript
复制
// 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);
    }
}

但不幸的是,它并没有像预期的那样工作,相机看起来总是错误的方向。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-15 12:12:29

最后,我用@joe的研究和帮助解决了这个问题。

以下是方法的最终版本:

代码语言:javascript
复制
// [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);
            }
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2018-05-14 07:49:27

OnSensorChanged应该是:

代码语言:javascript
复制
   if (e.Sensor == mRotationSensor)
    {
        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[1]) + 360) % 360;      // map [-Pi...+Pi] to [0...360]
        app.yaw = (Urho.MathHelper.RadiansToDegrees(ov[0]) + 360) % 360;
        Log.Error("pitch=",app.pitch+"");
        Log.Error("yaw=", app.yaw + "");
        // map [-Pi/2...+Pi/2] to [0...360]
        app.cameraNode.Rotation = new Urho.Quaternion(app.pitch, app.yaw, 0);

    }

您需要在SensorManager方法中为您的OnCreate添加这些内容:

代码语言:javascript
复制
 mSensorManager = (SensorManager)GetSystemService(Activity.SensorService);
 mRotationSensor = mSensorManager.GetDefaultSensor(SensorType.RotationVector);
 mSensorManager.RegisterListener(this, mRotationSensor, SensorDelay.Game);

并添加以下变量:

代码语言:javascript
复制
 private SensorManager mSensorManager;
 private Sensor mRotationSensor;

最后,不要忘记为您的活动实现ISensorEventListener接口。

我提供了一个关于github的演示

票数 1
EN

Stack Overflow用户

发布于 2018-05-16 14:11:02

使用四元数的另一种可能的解决方案:

代码语言:javascript
复制
public void OnSensorChanged(SensorEvent e) {
    if (e.Sensor.Type == SensorType.GeomagneticRotationVector) {
        var qv = new float[4];
        SensorManager.GetQuaternionFromVector(qv, e.Values.ToArray());
        try {
            app.CameraNode.Rotation = new Quaternion(qv[1], -qv[3], qv[2], qv[0]);
            app.CameraNode.Pitch(90.0f);
            app.CameraNode.Roll(180.0f);
        }
        catch (System.Exception ex) {
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50290730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档