このページの内容

頂点スキニング

はじめに

Qt Quick 3Dでは、メッシュジオメトリのスケルトンアニメーション向けに頂点スキニングをサポートしています。

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

ほとんどの場合、アプリケーション開発者はスキニング API を手動で使用する必要はありません。通常のワークフローでは、外部のコンテンツ作成ツールを使用してスケルトンとスキン(これは「リギング」とも呼ばれることがあります)を定義し、Balsam アセットインポートツールを使用して、そのアセットを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 にスキニング情報を含める必要があります。これを行うには、頂点バッファにJointSemantic およびWeightSemantic を持つvertex attributes を含めます。

JointSemantic 属性は、スケルトン内のどのジョイントが特定の頂点に影響を与えるかを決定します。これは、Joint.index で指定されたインデックス値を使用します。この属性には4つのインデックスが含まれているため、1つの頂点には最大4つのジョイントが影響を与えることができます。

WeightSemantic 属性は、それらのジョイントの影響の強さを記述します。これには4つの浮動小数点値が含まれており、各値はJointSemantic 属性内の対応する位置にあるインデックスを持つジョイントに割り当てられる重みを決定します。

たとえば、上記のスケルトンを例にとると、ある頂点が以下の属性を持っている場合:

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

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

別の例として、次のような属性がある場合:

JointSemantic 属性WeightSemantic 属性
QVector4D(1, 2, 0, 0)QVector4D(0.5, 0.25, 0.0, 0.0)

この頂点は、joint1の動きの50%とjoint2の動きの25%を合わせた分だけ移動します。

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

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

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

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

SequentialAnimation 、ParallelAnimation 、NumberAnimation をネストさせることで複雑なアニメーションを作成することも可能ですが、スキンモデルをアニメーション化するには、一般的にタイムラインアニメーションを使用する方が便利です。

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