頂点スキニング

はじめに

Qt Quick 3D はメッシュ形状のスケルタルアニメーション用に頂点のスキニングをサポートしています。

スケルタルアニメーションの実用的なデモについては、簡単なスキニングの例を参照してください。

ほとんどの場合、アプリケーション開発者はスキニング API を手動で使用することはないでしょう。通常のワークフローは、外部コンテンツ作成ツールを使用してスケルトンとスキンを定義し(これはリギングとも呼ばれることがあります)、バルサムアセットインポートツールを使用してアセットをQt Quick 3Dのネイティブフォーマットに変換します。

スケルトンの定義

スケルトンアニメーションの基本は、Skeleton です。これは、モデルがどのように動けるかを抽象的に表現したもので、脊椎動物の物理的な骨格の仕組みにヒントを得たものです。スケルトンの「骨」は、Joint ノードの階層によって表現されます。もちろん、これらは必ずしも実際の骨を表す必要はありません。

Skeleton {
    id: qmlskeleton
    Joint {
        id: joint0
        index: 0
        skeletonRoot: qmlskeleton
        Joint {
            id: joint1
            index: 1
            skeletonRoot: qmlskeleton
        }
        Joint {
            id: joint2
            index: 2
            skeletonRoot: qmlskeleton
        }

    }
}

スケルトンをモデルに接続する

スケルトンをモデルに適用するには、モデルのskeleton プロパティを設定します:

Model {
    skeleton: qmlskeleton
    ...

スケルトンが効果を発揮するためには、モデルのgeometry にスキニング情報が含まれている必要があります。これは、頂点バッファにJointSemanticWeightSemantic とともにvertex attributes を含めることで行われます。

JointSemantic アトリビュートは、スケルトンのどのジョイントが与えられた頂点に影響を与えることができるかを決定します。これはJoint.index で指定されたインデックス値を使用します。このアトリビュートは4つのインデックスを含むので、最大4つのジョイントが1つの頂点に影響を与えることができます。

WeightSemantic 属性は、これらのジョイントの影響のさを記述します。これは4つの浮動小数点値を含み、各値はJointSemantic アトリビュートの対応する位置のインデックスを持つジョイントに与えられる重みを決定します。

例えば、上のスケルトンが与えられたとき、頂点が以下のアトリビュートを持つとします:

JointSemantic 属性WeightSemantic 属性
QVector4D(2, 0, 0, 0)QVector4D(1.0, 0.0, 0.0, 0.0)

を持つ頂点は、100%joint2の影響を受け、そのジョイントと同じだけ動きます。JointSemantic アトリビュートの最後の3つのインデックスは、対応する重みが0.0 であるため、無視されます。

別の例として、次のような属性があります:

JointSemantic アトリビュートWeightSemantic アトリビュート
QVector4D(1, 2, 0, 0)QVector4D(0.5, 0.25, 0.0, 0.0)

の場合、頂点はジョイント1の動きの50%とジョイント2の動きの25%だけ動かされます。

さらに、スケルトンは抽象的な表現なので、モデルはジョイントのジオメトリ情報を指定する必要があります。パフォーマンス上の理由から、これは情報を直接指定することによっては行われません。その代わりに、Model.inverseBindPoses には、各ジョイントを初期位置に移動するのに必要な変換行列の逆行列が含まれています。

スケルトンのアニメーション

スケルトンのジョイントを変形させると、そのジョイントに接続されているすべての頂点が移動します。ジョイントはNode を継承しているので、スケルトンは標準的なQML animations を使うだけでアニメーションさせることができます。

NumberAnimation {
    target: joint1
    property: "eulerRotation.z"
    duration: 5000
    from: -90
    to: 90
    running: true
}

SequentialAnimationParallelAnimationNumberAnimation を入れ子にすることで、複雑なアニメーションを作成することも可能ですが、一般的に、スキニングされたモデルのアニメーションには、タイムラインアニメーションを使う方が便利です。

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