在 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():