在 QT 中以(快速)恒定速率旋转 3D 对象
Rotating a 3D object at a (fast) constant rate in QT
这似乎是一个非常简单的问题,但我已经尝试了一个我认为可行的实现并且它“有点”有效。
我的期望:
能够以相当快的恒定速率绕轴旋转对象。 (大约 120 *RPM 或 2 *RPS。)
我试过的:
我的基本实现是一个 QTimer,它会在一定的毫秒数后超时(也发出超时信号)。超时会将 3D 对象旋转一定量,例如 0.1 度。
可以执行以下操作的示例代码如下所示:
//Setup timer and 3d object (Q3DObject is just an example and may not even exist, doesn't matter)
QTimer *rotationTimer = new QTimer();
Q3DObject *object = new Q3DObject(...)
void main()
{
//Connect signal and slot
connect(rotationTimer, SIGNAL(timeout()), this, SLOT(updateRotation()))
rotationTimer->start(10); //Timeout every 10 ms
}
//This is a slot
void updateRotation()
{
//Get current rotation from object then "add" a quaternion rotation about the -x axis of 0.1 degree.
object->setRotation(object->rotation * QQuaternion::fromAxisAndAngle(-1.0f,0.0f,0.0f,0.1f));
}
这个实现的问题是即使超时为 1 毫秒,它也非常慢,因为它每 1 毫秒增加 0.1。这意味着它的最大角度变化是每 1 秒 100 度。这太慢了。将 0.1 度的增量更改为更大的值确实有助于提高速度,但从每次增量的过渡平滑程度来看,更高的数字会导致旋转看起来很不稳定。
我觉得这里有更好的方法来实现我的目标,但我就是想不出任何方法。我也认为这种方法也不是计算最有效的旋转对象的方法。
有谁知道实现这种效果的更好方法吗?我会继续研究,看看能否同时找到更好的解决方案。
似乎你想要的是制作旋转动画,所以在这种情况下最好使用 QVariantAnimation,class 将在已建立的范围之间插入值,因此它是不再需要定义最小变化(您使用的 0.1 度)。
Q3DFoo foo;
QVariantAnimation animation;
animation.setStartValue(QVariant(0.0));
animation.setEndValue(QVariant(360.0));
animation.setDuration(5 * 1000);
animation.setLoopCount(-1);
QObject::connect(&animation, &QVariantAnimation::valueChanged, &foo, [&foo](const QVariant & value){
foo.setRotation(QQuaternion::fromAxisAndAngle(-1.0f, 0.0f, 0.0f, value.toFloat()));
});
animation.start():
这似乎是一个非常简单的问题,但我已经尝试了一个我认为可行的实现并且它“有点”有效。
我的期望: 能够以相当快的恒定速率绕轴旋转对象。 (大约 120 *RPM 或 2 *RPS。)
我试过的: 我的基本实现是一个 QTimer,它会在一定的毫秒数后超时(也发出超时信号)。超时会将 3D 对象旋转一定量,例如 0.1 度。
可以执行以下操作的示例代码如下所示:
//Setup timer and 3d object (Q3DObject is just an example and may not even exist, doesn't matter)
QTimer *rotationTimer = new QTimer();
Q3DObject *object = new Q3DObject(...)
void main()
{
//Connect signal and slot
connect(rotationTimer, SIGNAL(timeout()), this, SLOT(updateRotation()))
rotationTimer->start(10); //Timeout every 10 ms
}
//This is a slot
void updateRotation()
{
//Get current rotation from object then "add" a quaternion rotation about the -x axis of 0.1 degree.
object->setRotation(object->rotation * QQuaternion::fromAxisAndAngle(-1.0f,0.0f,0.0f,0.1f));
}
这个实现的问题是即使超时为 1 毫秒,它也非常慢,因为它每 1 毫秒增加 0.1。这意味着它的最大角度变化是每 1 秒 100 度。这太慢了。将 0.1 度的增量更改为更大的值确实有助于提高速度,但从每次增量的过渡平滑程度来看,更高的数字会导致旋转看起来很不稳定。
我觉得这里有更好的方法来实现我的目标,但我就是想不出任何方法。我也认为这种方法也不是计算最有效的旋转对象的方法。
有谁知道实现这种效果的更好方法吗?我会继续研究,看看能否同时找到更好的解决方案。
似乎你想要的是制作旋转动画,所以在这种情况下最好使用 QVariantAnimation,class 将在已建立的范围之间插入值,因此它是不再需要定义最小变化(您使用的 0.1 度)。
Q3DFoo foo;
QVariantAnimation animation;
animation.setStartValue(QVariant(0.0));
animation.setEndValue(QVariant(360.0));
animation.setDuration(5 * 1000);
animation.setLoopCount(-1);
QObject::connect(&animation, &QVariantAnimation::valueChanged, &foo, [&foo](const QVariant & value){
foo.setRotation(QQuaternion::fromAxisAndAngle(-1.0f, 0.0f, 0.0f, value.toFloat()));
});
animation.start():