差分

ナビゲーションに移動 検索に移動

スケルタルアニメーション

2,886 バイト追加, 2023年5月24日 (水) 09:21
ページの作成:「'''スケルタルアニメーション'''(英語:skeletal animation)とは、3DCGにおけるアニメーションの手法のひとつで、キャラク…」
'''スケルタルアニメーション'''(英語:skeletal animation)とは、[[3DCG]]における[[アニメーション]]の手法のひとつで、キャラクターの内部に「骨(ボーン)」を持たせ、その移動や回転にあわせて表面の[[ポリゴン]]([[メッシュ]])を変化させるというものです。

いわゆる[[スキンメッシュ]]の技法のひとつですが、世間一般ではおおよそ「スキンメッシュ≒スケルタルアニメーション」となっています。

スケルタルアニメーションでは「時間ごとのボーンの移動量や回転量」というデータだけを記録しておき、再生時にメッシュの変化を計算してやります。ボーンは階層構造になっており、親ボーンからの変化の相対値だけを保持するのが一般的です。

なお、この技法は決して実際の解剖学や物理的なプロセスを模倣するものではありません。ボーンというと人間や動物というイメージですが、実のところ[[ノートパソコン]]の[[液晶]]の繋ぎ目やドアと壁を繋ぐ「ラッチ」みたいなものです。なので「ドアの開閉」などにも応用できます。

== 主な用語 ==

=== Bone Transform ===
ボーンの位置や回転の情報を格納した[[行列]]です。複数ボーンの配列となっているのが一般的です。

=== Bone Index ===
メッシュが保持する「ボーンとの繋がり」を表すBone Transform配列のインデックスです。関節付近を適切に処理するため複数のボーンとの繋がりを配列として保持し、その影響度合いをBone Weightに格納します。

=== Bone Weight ===
メッシュが保持する「ボーンとの繋がり」が複数に渡る場合の影響度を表します。一般的にBone Weight配列の合計は「1」になります。

[[バーテックスシェーダー]]ではだいたいこんな感じです。
シェーダーで処理する場合は「ボーンとの繋がり」をvec4に収めたいので最大4個が定番です。別に4個でなくてもいいです。
<source lang=c>
layout(set = 0, binding = 3) uniform BonesBuffer
{
mat4 BoneTransformations[64];//各ボーンの位置や回転などを格納した行列の配列
};

layout(location = 0) in vec3 Position;
layout(location = 1) in vec2 UV;
layout(location = 2) in vec4 BoneWeights;// つながりは
layout(location = 3) in uvec4 BoneIndices;// 頂点ごとに持つ

mat4 skin = BoneTransforms[BoneIndex[0]] * BoneWeights[0]
+ BoneTransforms[BoneIndices[1]] * BoneWeights[1]
+ BoneTransforms[BoneIndices[2]] * BoneWeights[2]
+ BoneTransforms[BoneIndices[3]] * BoneWeights[3];

gl_Position = Projection * View * World * skin * vec4(Position, 1);
</source>

案内メニュー