动画围绕特定轴的 qt3d 旋转
Animating a qt3d rotation around a specific axis
我正在尝试在 Qt3D 中设置一个对象的动画,使其围绕特定轴(而不是原点)旋转,同时执行其他转换(例如缩放和平移)。
以下代码根据需要旋转对象,但还没有动画。
QMatrix4x4 mat = QMatrix4x4();
mat.scale(10);
mat.translate(QVector3D(-1.023, 0.836, -0.651));
mat.rotate(QQuaternion::fromAxisAndAngle(QVector3D(0,1,0), -20));
mat.translate(-QVector3D(-1.023, 0.836, -0.651));
//scaling here after rotating/translating shifts the rotation back to be around the origin (??)
Qt3DCore::QTransform *transform = new Qt3DCore::QTransform(root);
transform->setMatrix(mat);
//...
entity->addComponent(transform); //the entity of the object i am animating
我没有按照我的意愿将 QPropertyAnimation 合并到此代码中。仅对 rotationY 属性 设置动画不会让我包括旋转原点,因此它围绕错误的轴旋转。动画矩阵 属性 产生最终结果,但在我的场景中以不是 desired/realistic 的方式旋转。那么我怎样才能让这个旋转围绕给定的轴旋转呢?
编辑:有一个 QML 等同于我想要的。在那里,您可以指定旋转的原点并设置角度值的动画:
Rotation3D{
id: doorRotation
angle: 0
axis: Qt.vector3d(0,1,0)
origin: Qt.vector3d(-1.023, 0.836, -0.651)
}
NumberAnimation {target: doorRotation; property: "angle"; from: 0; to: -20; duration: 500}
我如何在 C++ 中执行此操作?
我认为可以通过简单地修改orbittransformcontroller.cpp
:
中的updateMatrix()
方法来使用Qt 3D: Simple C++ Example来获得它所寻找的东西
void OrbitTransformController::updateMatrix()
{
m_matrix.setToIdentity();
// Move to the origin point of the rotation
m_matrix.translate(40, 0.0f, -200);
// Infinite 360° rotation
m_matrix.rotate(m_angle, QVector3D(0.0f, 1.0f, 0.0f));
// Radius of the rotation
m_matrix.translate(m_radius, 0.0f, 0.0f);
m_target->setMatrix(m_matrix);
}
注:将圆环体变成小球体观察旋转更容易
提问者编辑:这个思路确实是一个很好的解决问题的方法!要将其专门应用于我的场景,updateMatrix()
函数必须如下所示:
void OrbitTransformController::updateMatrix()
{
//take the existing matrix to not lose any previous transformations
m_matrix = m_target->matrix();
// Move to the origin point of the rotation, _rotationOrigin would be a member variable
m_matrix.translate(_rotationOrigin);
// rotate (around the y axis)
m_matrix.rotate(m_angle, QVector3D(0.0f, 1.0f, 0.0f));
// translate back
m_matrix.translate(-_rotationOrigin);
m_target->setMatrix(m_matrix);
}
我在控制器 class 中也制作了 _rotationOrigin
属性,然后可以在外部为每个控制器设置不同的值。
我正在尝试在 Qt3D 中设置一个对象的动画,使其围绕特定轴(而不是原点)旋转,同时执行其他转换(例如缩放和平移)。
以下代码根据需要旋转对象,但还没有动画。
QMatrix4x4 mat = QMatrix4x4();
mat.scale(10);
mat.translate(QVector3D(-1.023, 0.836, -0.651));
mat.rotate(QQuaternion::fromAxisAndAngle(QVector3D(0,1,0), -20));
mat.translate(-QVector3D(-1.023, 0.836, -0.651));
//scaling here after rotating/translating shifts the rotation back to be around the origin (??)
Qt3DCore::QTransform *transform = new Qt3DCore::QTransform(root);
transform->setMatrix(mat);
//...
entity->addComponent(transform); //the entity of the object i am animating
我没有按照我的意愿将 QPropertyAnimation 合并到此代码中。仅对 rotationY 属性 设置动画不会让我包括旋转原点,因此它围绕错误的轴旋转。动画矩阵 属性 产生最终结果,但在我的场景中以不是 desired/realistic 的方式旋转。那么我怎样才能让这个旋转围绕给定的轴旋转呢?
编辑:有一个 QML 等同于我想要的。在那里,您可以指定旋转的原点并设置角度值的动画:
Rotation3D{
id: doorRotation
angle: 0
axis: Qt.vector3d(0,1,0)
origin: Qt.vector3d(-1.023, 0.836, -0.651)
}
NumberAnimation {target: doorRotation; property: "angle"; from: 0; to: -20; duration: 500}
我如何在 C++ 中执行此操作?
我认为可以通过简单地修改orbittransformcontroller.cpp
:
updateMatrix()
方法来使用Qt 3D: Simple C++ Example来获得它所寻找的东西
void OrbitTransformController::updateMatrix()
{
m_matrix.setToIdentity();
// Move to the origin point of the rotation
m_matrix.translate(40, 0.0f, -200);
// Infinite 360° rotation
m_matrix.rotate(m_angle, QVector3D(0.0f, 1.0f, 0.0f));
// Radius of the rotation
m_matrix.translate(m_radius, 0.0f, 0.0f);
m_target->setMatrix(m_matrix);
}
注:将圆环体变成小球体观察旋转更容易
提问者编辑:这个思路确实是一个很好的解决问题的方法!要将其专门应用于我的场景,updateMatrix()
函数必须如下所示:
void OrbitTransformController::updateMatrix()
{
//take the existing matrix to not lose any previous transformations
m_matrix = m_target->matrix();
// Move to the origin point of the rotation, _rotationOrigin would be a member variable
m_matrix.translate(_rotationOrigin);
// rotate (around the y axis)
m_matrix.rotate(m_angle, QVector3D(0.0f, 1.0f, 0.0f));
// translate back
m_matrix.translate(-_rotationOrigin);
m_target->setMatrix(m_matrix);
}
我在控制器 class 中也制作了 _rotationOrigin
属性,然后可以在外部为每个控制器设置不同的值。