Qt Quick 3D - 子网格示例

演示如何将材质分配给子网格。

此示例演示了如何映射材质和子网格。

子网格和材质

Model 由两个或多个网格构成时,这些网格被称为子网格。每个子网格都可以有自己的材质,但并不要求每个模型提供一种以上的材质。如果子网格的数量多于材料的数量,那么materials 列表中的最后一种材料将用于所有再加工的子网格。如果一个模型的每个子网格都有一种材料,那么这些材料就会一对一地映射,这意味着列表中的第一种材料会应用于第一个子网格,第二种材料会应用于第二个子网格,以此类推。子网格在模型中的排序方式取决于创建模型的三维建模工具是如何创建和导出模型的。

下面的示例显示了两个畸变立方体,其中立方体的每个面都是一个子网格。

如果我们看一下左边的立方体,就会发现有一个面是红色的,而其余的面都是绿色的,原因当然是材质只有两种,即一种红色,一种绿色。在我们的模型中,第一个子网格恰好是畸变立方体的 "顶 "面,由于红色材质在材质列表中排在第一位,因此它的颜色也是红色的。列表中的第二个材质是绿色材质,它被映射到第二个子网格,也就是被畸变立方体的 "前 "面,由于它是列表中的最后一个材质,因此也将成为畸变立方体其余所有面的材质。

DistortedCube {
    x: -4
    scale: Qt.vector3d(2, 2, 2)
    materials: [ PrincipledMaterial {
        baseColor: "red"
        lighting: PrincipledMaterial.NoLighting
    },
    PrincipledMaterial {
                    baseColor: "green"
                    lighting: PrincipledMaterial.NoLighting
                } ]

看看右边的立方体,我们可以看到它被赋予了更多的颜色,这当然是因为我们现在为六个子模型各提供了一种材料,每种材料都有不同的颜色。

Model {
    source: "qrc:/meshes/distortedcube.mesh"

    PrincipledMaterial {
        id: frontTop_material
        baseColor: "red"
        cullMode: Material.NoCulling
        lighting: PrincipledMaterial.NoLighting
    }

    PrincipledMaterial {
        id: frontBottom_material
        baseColor: "green"
        cullMode: Material.NoCulling
        lighting: PrincipledMaterial.NoLighting
    }

    PrincipledMaterial {
        id: leftSide_material
        baseColor: "blue"
        cullMode: Material.NoCulling
        lighting: PrincipledMaterial.NoLighting
    }

    PrincipledMaterial {
        id: rightSide_material
        baseColor: "pink"
        cullMode: Material.NoCulling
        lighting: PrincipledMaterial.NoLighting
    }

    PrincipledMaterial {
        id: backSide_material
        baseColor: "orange"
        cullMode: Material.NoCulling
        lighting: PrincipledMaterial.NoLighting
    }

    PrincipledMaterial {
        id: bottomSide_material
        baseColor: "navy"
        cullMode: Material.NoCulling
        lighting: PrincipledMaterial.NoLighting
    }

    materials: [
        frontTop_material,
        frontBottom_material,
        leftSide_material,
        backSide_material,
        rightSide_material,
        bottomSide_material
    ]
}

示例项目 @ code.qt.io

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.