Qt Quick 3D詳細レベル

ディテールレベル(LoD)

Level of Detail(LoD)とは、カメラから異なる距離で3Dモデルの代替バージョンを使用するテクニックのことです。この手法の目的は、モデルが遠くにあるときや画面占有率が低いときには、より単純なバージョンを使用し、一方、モデルが近くにあるときや画面占有率が高いときには、より詳細なバージョンを使用することで、リソースの使用量を最適化することです。このアプローチにより、ビジュアルの忠実度を維持しながら、GPUリソースを効率的に使用することができます。

Qt Quick 3Dは、自動システムと明示的な詳細レベルシステムの両方を提供します。自動システムは、メッシュファイルに保存された複数の詳細レベルを持つ単一のメッシュを使用することに基づいています。明示的システムは、 コンポーネントを使用して、子モデルとして異なる詳細レベルを指定することに基づいています。LodManager

自動詳細レベル

自動詳細レベルサポートを使用する主な方法は、バルサムアセットインポートツールでコンテンツをインポートすることです。アセットをインポートする際にフラグ--generateMeshLevelsOfDetail を使用することで、ツールは可能な限り各メッシュの詳細レベルを生成します。これは、全体的な特徴を維持しながら、元のメッシュのジオメトリを単純化しようとすることで行われます。その結果、ジオメトリが追加され、詳細レベルが追加されるごとに新しいインデックス値が生成され、さらに、与えられたレンダリングサイズに対してどのメッシュを使用するかを決定するために使用される距離ファクタが生成されます。この距離係数は、レンダリングされるオブジェクトとカメラとの距離に関係しますが、最も重要なことは、ピクセルあたりのジオメトリの比率を適切にすることです。このデータは.meshファイルに書き込まれ、モデルで使用されるときに自動的に使用されます。

自動システムのトレードオフであり、デフォルトで有効になっていない理由は、ジオメトリが削減されると、視覚的なアーチファクトが発生する可能性があるためです。使用されるジオメトリ簡略化アルゴリズムは、モデルの特徴を保持しようとしますが、場合によっては、意図した外観を維持するためにメッシュの法線を再計算する必要があります。これは、アセットのインポート時に--recalculateLodNormals フラグを使用することで実行できます。法線の再計算プロセスは、引数--recalculateLodNormalsMergeAngle--recalculateLodNormalsSplitAngle にオイラー角の値を渡すことでさらに調整でき、それぞれ法線をマージまたは分割する角度を制御できます。

自動システムの主な利点は、アセットが適切な設定でインポートされると簡単に使用できることです。自動システムを使用するために追加のコードは必要なく、詳細ジオメトリのレベルを含む生成されたメッシュファイルを参照するすべてのモデルは、モデルが画面上で占めるピクセル数に基づいて適切なジオメトリを自動的に選択します。

Camera またはModellevelOfDetailBias プロパティを使用して、global level またはper-model level で詳細レベルの自動選択動作を微調整することができます。これらのバイアスプロパティのデフォルトレベルはそれぞれ 1.0 で、自動システムによって計算された値を信頼することを意味します。この値は理想的な値に対するバイアスであり、1.0より小さい値は、より小さい詳細レベルに切り替える前に、さらに小さいレンダリングサイズを必要とします。1.0を超える値は、より低いレベルのディテールがより早く使用されるようになります。0.0の値は、詳細レベルの使用を完全に無効にし、常に元のメッシュジオメトリを使用します。

自動システムは、明示システムほど柔軟ではありません。例えば、自動システムは常にすべての詳細レベルに対して同じマテリアルを使用しますが、これは必ずしも望ましいとは限りません。もう一つの潜在的な欠点は、異なる詳細レベル間の移行がないことです。これは、理想的には自動詳細レベルでは必要ありませんが、特定の使用ケースでは望ましい場合があります。

明示的詳細度

明示的詳細度システムは、自動システムよりも柔軟であるが、使用するためにはより多くの作業を必要とする。明示的システムは、LodManager コンポーネントを使用して、子コンポーネントModel として異なる詳細レベルを指定することに基づいている。ModelのインスタンスであるLodManager の子はすべて、詳細レベルとみなされます。各詳細レベルは、独自のジオメトリとマテリアルを持つ完全なカスタムモデルとすることができるため、これは非常に強力です。

LodManager コンポーネントにはdistances プロパティもあり、どの子Model を使用するかを決定するために使用されます。LodManager ノードは、カメラの距離が各距離境界に近づくと、次の子Model に遷移します。fadeDistance プロパティを使用して、クロスフェード遷移がどの距離で始まり、どの距離の境界で終わるかを設定できます。

これは、明示的詳細レベルシステムの使用方法のです:

参照した例では、LodManager を使用して、大理石の胸像の詳細レベルごとに異なるメッシュ ファイルを明示的に指定しています。

LodManager {
    camera: camera
    distances: [100, 140, 180]
    fadeDistance: 10

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_0.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_1.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_2.mesh"
        materials: [ marbleMaterial ]
    }

    Model {
        scale: Qt.vector3d(100, 100, 100);
        source: "meshes/marble_bust_01_LOD_3.mesh"
        materials: [ marbleMaterial ]
    }
}

このコードでは、distance リストを使用して、異なる詳細レベル間の境界を定義する方法と、クロスフェード遷移を定義するために使用する fadeDistance プロパティを示します。

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