「スケルタルアニメーション」を編集中
ナビゲーションに移動
検索に移動
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
5行目: | 5行目: | ||
スケルタルアニメーションでは「時間ごとのボーンの移動量や回転量」というデータだけを記録しておき、再生時にメッシュの変化を計算してやります。ボーンは階層構造になっており、親ボーンからの変化の相対値だけを保持するのが一般的です。 | スケルタルアニメーションでは「時間ごとのボーンの移動量や回転量」というデータだけを記録しておき、再生時にメッシュの変化を計算してやります。ボーンは階層構造になっており、親ボーンからの変化の相対値だけを保持するのが一般的です。 | ||
− | + | なお、この技法は決して実際の解剖学や物理的なプロセスを模倣するものではありません。ボーンというと人間や動物というイメージですが、実のところ[[ノートパソコン]]の[[液晶]]の繋ぎ目やドアと壁を繋ぐ「ラッチ」みたいなものです。なので「ドアの開閉」などにも応用できます。 | |
== 主な用語 == | == 主な用語 == | ||
16行目: | 16行目: | ||
=== Bone Weight === | === Bone Weight === | ||
− | メッシュが保持する「ボーンとの繋がり」が複数に渡る場合の影響度を表します。一般的にBone | + | メッシュが保持する「ボーンとの繋がり」が複数に渡る場合の影響度を表します。一般的にBone Weight配列の合計は「1」になります。 |
− | |||
[[バーテックスシェーダー]]ではだいたいこんな感じです。 | [[バーテックスシェーダー]]ではだいたいこんな感じです。 | ||
− | + | シェーダーで処理する場合は「ボーンとの繋がり」をvec4に収めたいので最大4個が定番です。別に4個でなくてもいいです。 | |
<source lang=c> | <source lang=c> | ||
− | |||
layout(set = 0, binding = 3) uniform BonesBuffer | layout(set = 0, binding = 3) uniform BonesBuffer | ||
{ | { | ||
− | mat4 BoneTransformations[ | + | mat4 BoneTransformations[64];//各ボーンの位置や回転などを格納した行列の配列 |
}; | }; | ||
− | |||
layout(location = 0) in vec3 Position; | layout(location = 0) in vec3 Position; | ||
layout(location = 1) in vec2 UV; | layout(location = 1) in vec2 UV; | ||
− | layout(location = 2) in vec4 BoneWeights;// | + | layout(location = 2) in vec4 BoneWeights;// つながりは |
− | layout(location = 3) in uvec4 BoneIndices;// | + | 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> | </source> | ||
− | |||
− | |||
− | |||
− | |||
− |