頂点スキニング
はじめに
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 にスキニング情報が含まれている必要があります。これは、頂点バッファにJointSemantic
とWeightSemantic
とともに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 }
SequentialAnimation 、ParallelAnimation 、NumberAnimation を入れ子にすることで、複雑なアニメーションを作成することも可能ですが、一般的に、スキニングされたモデルのアニメーションには、タイムラインアニメーションを使う方が便利です。
© 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.