ProceduralMesh QML Type

允许从 QML 创建几何体。更多

Import Statement: import QtQuick3D.Helpers
Since: Qt 6.6
Inherits:

Geometry

属性

详细说明

ProceduralMesh 是一种辅助类型,允许通过 QML 创建几何体实例。几何体组件是抽象的,通常由 C++ 创建。

component TorusMesh : ProceduralMesh {
    property real rings: 50
    property real segments: 50
    property real radius: 100.0
    property real tubeRadius: 10.0
    property var meshArrays: generateTorus(rings, segments, radius, tubeRadius)
    positions: meshArrays.verts
    normals: meshArrays.normals
    uv0s: meshArrays.uvs
    indexes: meshArrays.indices

    function generateTorus(rings: real, segments: real, radius: real, tubeRadius: real) {
        let verts = []
        let normals = []
        let uvs = []
        let indices = []

        for (let i = 0; i <= rings; ++i) {
            for (let j = 0; j <= segments; ++j) {
                let u = i / rings * Math.PI * 2;
                let v = j / segments * Math.PI * 2;

                let centerX = radius * Math.cos(u);
                let centerZ = radius * Math.sin(u);

                let posX = centerX + tubeRadius * Math.cos(v) * Math.cos(u);
                let posY = tubeRadius * Math.sin(v);
                let posZ = centerZ + tubeRadius * Math.cos(v) * Math.sin(u);

                verts.push(Qt.vector3d(posX, posY, posZ));

                let normal = Qt.vector3d(posX - centerX, posY, posZ - centerZ).normalized();
                normals.push(normal);

                uvs.push(Qt.vector2d(i / rings, j / segments));
            }
        }

        for (let i = 0; i < rings; ++i) {
            for (let j = 0; j < segments; ++j) {
                let a = (segments + 1) * i + j;
                let b = (segments + 1) * (i + 1) + j;
                let c = (segments + 1) * (i + 1) + j + 1;
                let d = (segments + 1) * i + j + 1;

                // Generate two triangles for each quad in the mesh
                // Adjust order to be counter-clockwise
                indices.push(a, d, b);
                indices.push(b, d, c);
            }
        }
        return { verts: verts, normals: normals, uvs: uvs, indices: indices }
    }
}

上面的代码定义了一个 TorusMesh 组件,该组件可用作模型组件的几何体。当环、段、半径或管半径属性被修改时,几何体也会随之更新。

ProceduralMesh 组件没有 C++ 创建几何体那么灵活,也没有 C++ 创建几何体那么好的性能,但它的方便性和简单性弥补了这一点。属性是固定的属性列表,填写后将自动生成必要的缓冲区。

属性文档

binormals : List<QVector3D>

保存二值属性列表。


colors : List<QVector4D>

该属性定义了顶点颜色值列表。


indexes : List<int>

该属性定义了属性列表的索引列表。如果该列表为空,将直接使用顶点缓冲区值。


joints : List<QVector4D>

此属性定义了用于绘制皮肤的联合索引列表。


normals : List<QVector3D>

法线属性列表


positions : List<QVector3D>

位置属性列表。如果该列表为空,则不会生成任何几何体。


primitiveMode : enumeration [default: ProceduralMesh.Triangles]

该属性定义了渲染几何体时使用的原始模式。

常量说明
ProceduralMesh.Points使用点基元模式。
ProceduralMesh.LineStrip使用线条原始模式。
ProceduralMesh.Lines使用线基元模式。
ProceduralMesh.TriangleStrip使用三角形条状基元模式。
ProceduralMesh.TriangleFan使用三角形扇形基元模式。
ProceduralMesh.Triangles使用三角形基元模式。

注意: 并非所有渲染后端都支持所有模式。


subsets : List<ProceduralMeshSubset>

该属性定义了一个子集列表,用于将几何体数据分割成多个子集。每个子集都可以有自己的材质。此数组的顺序与使用此几何体时 Model 的材质列表相对应。

此属性为可选属性,为空时将生成一个子集。

注意: 任何指定值超出可用顶点/索引值范围的子集都将被忽略。


tangents : List<QVector3D>

持有切线属性列表。


uv0s : List<QVector2D>

该属性定义了第一个 UV 通道(uv0)的 UV 坐标列表。


uv1s : List<QVector2D>

该属性定义了第二个 UV 通道(uv1)的 UV 坐标列表


weights : List<QVector4D>

该属性定义了用于绘制皮肤的关节权重列表。


© 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.