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

What is correct way to convert QGyroscopeReading to QVector3D?

本文关键字:方法 是什么 QGyroscopeReading 转换 QVector3D      更新时间:2023-10-16

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

QGyroscopeReadingx,yz值存储为qreal,而QVector3D使用float

由于 qreal 不能保证是浮动的(它的类型是在 Qt 构建时指定的(,因此无警告的朴素转换看起来非常丑陋:

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

肯定有更好的东西吗?

摘自 Qt doc. QGyroscopeReading Class:

QGyroscope读取单元

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

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

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

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

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

它的设计看起来很丑。它必须提醒您,这里有一些危险的代码。

为了防止在项目中传播此类代码,请从 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)
{}
}