将 QGyroscopeReading 转换为 QVector3D 的正确方法是什么?

What is correct way to convert QGyroscopeReading to QVector3D?

Qt5中是否有correct/good将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()));

肯定有更好的东西吗?

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

为了防止在项目中传播此类代码,请从 QVector3D 继承您的 class 并使用 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)
{}
}

来自 Qt 文档。 QGyroscopeReading Class:

QGyroscopeReading Units

The reading contains 3 values, measured in degrees per second that define the movement of the device around the x, y and z axes. Unlike QRotationReading, the values represent the current angular velocity rather than a fixed rotation. The measurements are in degrees per second.

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

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

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

Note that some platforms do not deliver timestamps correctly. Applications should be prepared for occasional issues that cause timestamps to jump backwards.