【问题标题】:What is correct way to convert QGyroscopeReading to QVector3D?将 QGyroscopeReading 转换为 QVector3D 的正确方法是什么?
【发布时间】:2018-08-26 21:09:42
【问题描述】:

Qt5中是否有正确/好的方法将QGyroscopeReading 转换为QVector3D

QGyroscopeReadingxyz 值存储为qreal,而QVector3D 使用float

由于 qreal 不保证是浮点数(它的类型在 Qt 构建时指定),所以无警告的幼稚转换看起来真的很难看:

QGyroscopeReading gr;
QVector3D myVec(static_cast<float>(gr.x())
  , static_cast<float>(gr.y())
  , static_cast<float>(gr.z()));

肯定有更好的东西吗?

【问题讨论】:

  • 请看我的preliminary answer。您能否详细说明在 Qt5 中 convert QGyroscopeReadingQVector3D 吗?是否要将角速度转换为 3d 矢量(即 3d 空间中的点或矢量)?

标签: c++ qt qt5 qvector3d qgyroscopereading


【解决方案1】:

来自 Qt 文档。 QGyroscopeReading Class:

QGyroscope 读取单元

读数包含 3 个值,以每秒度数为单位,定义设备围绕 x、y 和 z 轴的移动。与QRotationReading 不同,这些值表示当前角速度而不是固定旋转。测量值以度/秒为单位。

因此,将qreal 转换为float 是您最不关心的问题,除非您只想将值存储在QVector3D 中(请记住,这并不代表3D 空间中的点或向量)。但如果是这种情况,那么您的转换就可以了。 (虽然,我不明白为什么不将陀螺仪读数存储为QGyroscopeReading。)

如果您想将QGyroscodeReading 应用到QVector3D(例如显示效果),那么您可以将旋转应用到预定义的向量(例如QVector3D(0, 0, 1))。对于累积更新,也需要时间(将角速度转换为角度)。

目前,QGyroscopeReading::timestamp() 可能很有趣(即从当前时间戳和前一个时间戳确定持续时间)。虽然,医生。不是很令人鼓舞:

请注意,某些平台无法正确传递时间戳。应用程序应为偶尔会导致时间戳向后跳转的问题做好准备。

【讨论】:

  • QVector3D 也不一定代表空间中的一个点,但它提供了许多操作向量的有用方法(并且向量毕竟只是一个一维数字数组)。我理解它可能令人困惑的论点,但同时,如果不使用 QVector3D,我们应该如何对读数进行操作?
  • @LennartRolland 我同意。看来,您只想使用QVector3D 作为容器。如果是这种情况,并且您担心组件的精度,为什么不自制struct AngleVelocities { qReal rX, rY, rZ; };?我假设QVector3D 明确使用float 而不是qReal,因为它的预期用途是用于OpenGL 顶点,其中字节数是需要谨慎使用的关键因素。
【解决方案2】:

它的设计看起来很丑。它不得不提醒你,这里有一些危险的代码。

为了防止在项目中传播此类代码,请从 QVector3D 继承您的类并使用 qreal 参数定义构造函数。

class QRealVector3D: public QVector3D
{
QRealVector3D (qreal x, qreal y, qreal z):
QVector3D (static_cast<float>(x)
  , static_cast<float>(y)
  , static_cast<float>(z)
{}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多