问题描述
我在理解四元数以及如何将其转换为可用的0-360度角度以在相机应用程序中使用时遇到困难。我正在尝试实现类似于我们在本机Android相机应用程序中看到的功能,在该应用程序中,一条“水平”线与当前倾斜角度一起显示。 https://superuser.com/questions/1576964/error-timed-out-while-waiting-for-handshake
我正在从Xamarin.Essentials.OrientationSensor中读取“方向”读数,并以四元数的形式返回。我已经编写了一些函数来从Example photo抓取Euler角度(俯仰,滚动,偏航),但是当我垂直握住设备时(从纵向,顶部朝天花板,屏幕朝向我),这些角度似乎都不从0开始就像他们为“相机”应用所做的一样。我也遵循this answer来获取旋转角度和矢量,但是这些数字对我来说没有任何意义,除非这些计算错误?
所以我要寻找的是仅沿其中一个轴的旋转角度,因此您可以将手机用作水平仪,以查看是否要拍摄直线照片。
这是我到目前为止所有计算的代码,我在OpenTK.Quaternion
调用中使用ToAxisAngle()
命名空间。
private void OrientationSensorOnReadingChanged(object sender,OrientationSensorChangedEventArgs e)
{
var q = new Quaternion(e.Reading.Orientation.X,e.Reading.Orientation.Y,e.Reading.Orientation.Z,e.Reading.Orientation.W);
q.ToAxisAngle(out var axis,out var angle);
ToEulerAngles(q,out var roll,out var pitch,out var yaw);
var ax = q.X / Math.Sin(Math.Acos(q.W));
var ay = q.Y / Math.Sin(Math.Acos(q.W));
var az = q.Z / Math.Sin(Math.Acos(q.W));
var degrees = Math.Acos(q.W) * 2;
_gyroLabel.Text = "???";
}
private void ToEulerAngles(Quaternion quat,out double myRoll,out double myPitch,out double myYaw)
{
myRoll = RadiansToDegrees(Math.Atan2(2 * (quat.Y * quat.W - quat.X * quat.Z),1 - 2 * quat.Y * quat.Y - 2 * quat.Z * quat.Z));
myPitch = RadiansToDegrees(Math.Atan2(2 * (quat.X * quat.W + quat.Y * quat.Z),1 - 2 * quat.X * quat.X - 2 * quat.Z * quat.Z));
myYaw = RadiansToDegrees(Math.Asin(2 * quat.X * quat.Y + 2 * quat.W * quat.Z));
}
private double RadiansToDegrees(double rads)
{
return (180 / Math.PI) * rads;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)