Qt Quick 3D - モーフィングの例

Qt Quick 3Dでモーフィングアニメーションを制御する方法を説明します。

この例では、外部ツールからインポートされたモデルのモーフィング・アニメーションを制御する方法を示します。

メッシュの作成

モデルのメッシュは、Blender 3Dモデリングツールを使って作成しました。ベースシェイプに加えて、メッシュには3つのモーフターゲット(Blenderではシェイプキーと呼びます)が含まれています。

これはBlenderからglTFファイルとしてエクスポートされ、バルサムを使ってインポートされました。

モーフターゲットの制御

通常、モーフはタイムラインアニメーションかプロパティアニメーションで制御します。この例では、代わりにスライダを使い、異なる重みを自由に組み合わせて実験できるようにしています:

            Label { text: "Mouth:"; }
            RealSlider {
                id: mouthSlider
                from: 0.0
                to: 1.0
            }
            Label { text: "Ears and eyebrows:" }
            RealSlider {
                id: earSlider
                from: 0.0
                to: 1.0
            }
            Label { text: "Cubify:" }
            RealSlider {
                id: cubeSlider
                from: 0.0
                to: 1.0
            }

(RealSlider は、浮動小数点値を提供するシンプルなスライダーです。これはエフェクトの例から拝借したものです)。

メッシュの各ターゲットにはMorphTarget を定義します。モーフターゲットは、モーフィングを制御するためにバインドするオブジェクトです。通常、それらはアニメーションしますが、この例ではスライダーの値にバインドします:

        MorphTarget {
            id: morphtarget0
            weight: mouthSlider.value
            attributes: MorphTarget.Position | MorphTarget.Normal
        }
        MorphTarget {
            id: morphtarget1
            weight: earSlider.value
            attributes: MorphTarget.Position | MorphTarget.Normal
        }
        MorphTarget {
            id: morphtarget2
            weight: cubeSlider.value
            attributes: MorphTarget.Position | MorphTarget.Normal
        }

最後に、モデルを作成し、モーフターゲットをメッシュのターゲットにバインドします:

        Model {
            source: "suzanne.mesh"
            morphTargets: [
                morphtarget0,
                morphtarget1,
                morphtarget2
            ]
            materials: PrincipledMaterial {
                baseColor: "#41cd52"
                roughness: 0.1
            }
            SequentialAnimation on eulerRotation.y {
                NumberAnimation { from: -45; to: 45; duration: 10000 }
                NumberAnimation { from: 45; to: -45; duration: 10000 }
                loops: Animation.Infinite
            }
        }

ターゲットはリスト内の位置でマッチすることに注意してください:名前は重要ではありません。

プロジェクト例 @ code.qt.io

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