ProceduralMesh QML 类型

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

导入声明import QtQuick3D.Helpers
Qt 6.6
继承

Geometry

属性

详细描述

ProceduralMesh 是一个辅助类型,允许从 QML 创建 Geometry 实例。Geometry 组件是抽象的,通常从 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,它可以作为 Geometry 与 Model 组件一起使用。当修改环、段、半径或 tubeRadius 属性时,几何体将被更新。

ProceduralMesh 组件不如在 C++ 中创建 Geometry 那样灵活或高效,但它以便利和简单性弥补了这一点。属性是固定的属性列表,当填写时将自动生成必要的缓冲区。

属性文档

binormals : List<QVector3D>

包含双法线属性列表。


colors : List<QVector4D>

此属性定义了一个顶点颜色值的列表。


indexes : List<int>

此属性定义了一个指向属性列表的索引列表。如果此列表为空,则将直接使用顶点缓冲区值。


joints : List<QVector4D>

此属性定义了一个用于皮肤化的关节索引列表。


normals : List<QVector3D>

包含法线属性列表。


positions : List<QVector3D>

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


primitiveMode : 枚举 [默认: ProceduralMesh.Triangles]

此属性定义了渲染几何形状时使用的原始模式。

常量描述
ProceduralMesh.Points使用了点原始模式。
ProceduralMesh.LineStrip使用了线段原始模式。
ProceduralMesh.Lines使用了线条原始模式。
ProceduralMesh.TriangleStrip使用了三角形带原始模式。
ProceduralMesh.TriangleFan使用了三角形扇原始模式。
ProceduralMesh.Triangles使用了三角形原始模式。

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


subsets : List<ProceduralMeshSubset>

此属性定义了一个要分割几何数据的子集列表。每个子集都可以有自己的材质。此数组顺序对应于在使用此几何形状的模型时材质列表。

此属性是可选的,当为空时,结果为一个单一子集。

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


tangents : List<QVector3D>

包含法线属性列表。


uv0s : List<QVector2D>

此属性定义了一个用于第一个uv通道(uv0)的uv坐标列表。


uv1s : List<QVector2D>

此属性定义了一个用于第二个uv通道(uv1)的uv坐标列表。


weights : List<QVector4D>

此属性定义了一个用于蒙皮关节权重的列表。


© 2024 The Qt Company Ltd. 本文件中包含的文档贡献是各自所有者的版权。本提供的文档是根据自由软件基金会发布的《GNU自由文档许可证版本1.3》条款获许可。Qt及其相关标志是The Qt Company Ltd.在芬兰和/或世界其他国家的商标。所有其他商标均为其各自所有者的财产。