「スケルタルアニメーション」の版間の差分

 
(同じ利用者による、間の4版が非表示)
16行目: 16行目:


=== Bone Weight ===
=== Bone Weight ===
メッシュが保持する「ボーンとの繋がり」が複数に渡る場合の影響度を表します。一般的にBone Weight配列の合計は「1」になります。この値を使うことで関節付近のメッシュを変形する際におかしくなる現象を軽減できます。逆を言えば関節付近ではないメッシュでは特定のボーンにパラメーター全振りです。
メッシュが保持する「ボーンとの繋がり」が複数に渡る場合の影響度を表します。一般的にBone Weight配列の合計は「1」になります。この値を使うことで関節付近のメッシュを変形する際におかしくなる現象を軽減できます。関節付近ではないメッシュでは特定のボーンにパラメーター全振りです。


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


// 頂点バッファに「ボーンとの繋がり」と「ボーンの影響度」を持つ
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;// ボーンとの繋がり


void main()
void main()