设置实体旋转的原点(Qt 3D)

Posted

技术标签:

【中文标题】设置实体旋转的原点(Qt 3D)【英文标题】:Set origin point for Entity rotation (Qt 3D) 【发布时间】:2020-07-22 10:17:29 【问题描述】:

我有一个简单的 3D 场景和一个要围绕其原点旋转的框:

Entity 
    components: [ mesh, phongMaterial, transform ]

    CuboidMesh 
        id: mesh
        yzMeshResolution: Qt.size(2, 2)
        xzMeshResolution: Qt.size(2, 2)
        xyMeshResolution: Qt.size(2, 2)
        zExtent: 1
        xExtent: 1
        yExtent: 2
    

    PhongAlphaMaterial 
        id: phongMaterial
        property color randColor: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)

        ambient: randColor
        diffuse: randColor
        specular: randColor
        shininess: 1.0
        alpha: 0.4
    

    Transform 
        id: transform
        property real userAngle: 0.0
        scale: 1
        rotation: fromAxisAndAngle(Qt.vector3d(0, 0, 1), userAngle)
        translation: Qt.vector3d( 0.0, 0.0, 0.0 )
    

    QQ2.NumberAnimation 
        target: transform
        property: "userAngle"
        duration: 2000
        loops: QQ2.Animation.Infinite
        running: true
        easing.type: QQ2.Easing.InOutQuad
        from: 0
        to: 360
    

默认情况下,原点位于框的中心。如图所示,我需要将原点向下移动:

但我不知道该怎么做。我试过玩Transform.translation,但这只是沿着轴移动形状。我试过玩Transform.rotateAround(point, real angle, vector3d axis),但我没有看到任何变化。我更改了 point 值,但原点仍位于形状的中心。

Transform 
    id: transform
    property real userAngle: 0.0
    matrix: rotateAround(Qt.point(1,1), userAngle, Qt.vector3d( 0.0, 0.0, 1.0 ))

【问题讨论】:

【参考方案1】:

好的,我找到了解决方案。 rotateAround 的第一个参数是 3d 向量,而不是点。所以使用

matrix: rotateAround(Qt.vector3d(0.0, 1.0, 0.0), userAngle, Qt.vector3d( 0.0, 0.0, 1.0 ))

成功了。

【讨论】:

以上是关于设置实体旋转的原点(Qt 3D)的主要内容,如果未能解决你的问题,请参考以下文章

围绕特定轴动画qt3d旋转

Opengl模型矩阵在旋转一圈后不绕原点旋转

3d 矩阵旋转 - 对象奇怪地旋转

WPF 画一个3D矩形并旋转

按钮旋转 3D 对象 ARKit 2

如何在opengl的3d空间中旋转单个形状?