围绕特定轴动画qt3d旋转

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了围绕特定轴动画qt3d旋转相关的知识,希望对你有一定的参考价值。

我正在尝试动画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属性不允许我包含旋转原点,因此它围绕错误的轴旋转。动画矩阵属性会产生最终结果,但在我的场景中以不希望/逼真的方式旋转。那么我该如何设置此旋转的动画以围绕给定轴旋转?

编辑:有一个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 ++做到这一点?

答案

我认为可以通过简单地修改Qt 3D: Simple C++ Example中的updateMatrix()方法来使用orbittransformcontroller.cpp来获取它的内容:

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);
} 

我已经使_rotationOrigin也成为控制器类中的属性,然后可以在外部为每个控制器设置不同的值。

以上是关于围绕特定轴动画qt3d旋转的主要内容,如果未能解决你的问题,请参考以下文章

围绕Y轴旋转而不改变位置

如何围绕节点的 Y 轴旋转 SKSpriteNode?

Android:围绕Y的第二次180度旋转镜像会反映图像

围绕 X 或 Y 轴旋转的两层视图

围绕绝对轴旋转 3d 模型

围绕给定轴旋转任意平面会导致结果不一致