有没有正确/好的方法在Qt5中将QGyroscopeReading
转换为QVector3D
?
QGyroscopeReading
的x,y和z值存储为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)
{}
}