ProceduralMesh QML Type

QML からジオメトリを作成できるようにします。詳細...

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

Geometry

プロパティ

詳細説明

ProceduralMesh は、QML から Geometry インスタンスを作成するためのヘルパー型です。GeometryコンポーネントはAbstractであり、通常は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 }
    }
}

上のコードでは、Model コンポーネントで Geometry として使用できるコンポーネント TorusMesh を定義しています。リング、セグメント、半径、またはチューブ半径プロパティが変更されると、ジオメトリが更新されます。

ProceduralMeshコンポーネントは、C++でジオメトリを作成するほど柔軟でも高性能でもありませんが、利便性とシンプルさでそれを補っています。プロパティは固定属性リストであり、入力されると必要なバッファが自動的に生成される。

プロパティの説明

binormals : List<QVector3D>

binormals 属性リストを保持します。


colors : List<QVector4D>

このプロパティは、頂点カラー値のリストを定義します。


indexes : List<int>

このプロパティは、属性リストへのインデックスのリストを定義します。このリストが空のままの場合、頂点バッファ値が直接使用されます。


joints : List<QVector4D>

このプロパティは、スキニング用のジョイント インデックスのリストを定義します。


normals : List<QVector3D>

法線属性リストを保持します。


positions : List<QVector3D>

position 属性リストを保持します。このリストが空のままだと、ジオメトリは生成されません。


primitiveMode : enumeration [default: ProceduralMesh.Triangles]

このプロパティは、ジオメトリをレンダリングするときに使用するプリミティブ モードを定義します。

定数説明
ProceduralMesh.Pointsポイントプリミティブモードが使用されます。
ProceduralMesh.LineStripラインストリッププリミティブモードが使用されます。
ProceduralMesh.Linesラインプリミティブモードが使用されます。
ProceduralMesh.TriangleStrip三角形ストリッププリミティブモードが使用されます。
ProceduralMesh.TriangleFan三角形扇形プリミティブモード
ProceduralMesh.Triangles三角形プリミティブモードが使用されます。

注意: すべてのモードがすべてのレンダリングバックエンドでサポートされているわけではありません。


subsets : List<ProceduralMeshSubset>

このプロパティは、ジオメトリ データを分割するサブセットのリストを定義します。各サブセットは独自のマテリアルを持つことができます。この配列の順序は、このジオメトリを使用するときの Model のマテリアルリストに対応します。

このプロパティはオプションで、空の場合は 1 つのサブセットになります。

注意: 使用可能な頂点/インデックス値の範囲外の値を指定したサブセットは無視されます。


tangents : List<QVector3D>

tangents 属性リストを保持します。


uv0s : List<QVector2D>

このプロパティは、最初の uv チャンネル(uv0)の uv 座標のリストを定義します。


uv1s : List<QVector2D>

このプロパティは、2 番目の uv チャンネル (uv1) の uv 座標のリストを定義します。


weights : List<QVector4D>

このプロパティは、スキニングのためのジョイントの重みのリストを定義します。


©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。