「スケルタルアニメーション」を編集中

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

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。

最新版 編集中の文章
5行目: 5行目:
 
スケルタルアニメーションでは「時間ごとのボーンの移動量や回転量」というデータだけを記録しておき、再生時にメッシュの変化を計算してやります。ボーンは階層構造になっており、親ボーンからの変化の相対値だけを保持するのが一般的です。
 
スケルタルアニメーションでは「時間ごとのボーンの移動量や回転量」というデータだけを記録しておき、再生時にメッシュの変化を計算してやります。ボーンは階層構造になっており、親ボーンからの変化の相対値だけを保持するのが一般的です。
  
なお、ボーンというと人間や動物の「骨」というイメージですが、この技法は決して実際の解剖学や物理的なプロセスを模倣するものではありません。人体であれば本来なら曲がらない方向にも普通に曲がります。実のところ[[ノートパソコン]]の[[液晶]]の繋ぎ目やドアと壁を繋ぐ「ラッチ」みたいなものです。そのため「ドアの開閉」などにも応用できます。
+
なお、この技法は決して実際の解剖学や物理的なプロセスを模倣するものではありません。ボーンというと人間や動物というイメージですが、実のところ[[ノートパソコン]]の[[液晶]]の繋ぎ目やドアと壁を繋ぐ「ラッチ」みたいなものです。なので「ドアの開閉」などにも応用できます。
  
 
== 主な用語 ==
 
== 主な用語 ==
16行目: 16行目:
  
 
=== Bone Weight ===
 
=== Bone Weight ===
メッシュが保持する「ボーンとの繋がり」が複数に渡る場合の影響度を表します。一般的にBone Weight配列の合計は「1」になります。この値を使うことで関節付近のメッシュを変形する際におかしくなる現象を軽減できます。関節付近ではないメッシュでは特定のボーンにパラメーター全振りです。
+
メッシュが保持する「ボーンとの繋がり」が複数に渡る場合の影響度を表します。一般的にBone Weight配列の合計は「1」になります。
  
== 実装例 ==
 
 
[[バーテックスシェーダー]]ではだいたいこんな感じです。
 
[[バーテックスシェーダー]]ではだいたいこんな感じです。
シェーダーで処理する場合は「ボーンとの繋がり」をvec4に収めたいので最大4個が定番です。別に4個でなくてもいいです。人体のボーンの場合は3分岐から4分岐くらいなのでまず問題になることはありません。
+
シェーダーで処理する場合は「ボーンとの繋がり」を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[32];//各ボーンの位置や回転などを格納した行列の配列
+
     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;// 頂点ごとに持つ
  
void main()
+
mat4 skin = BoneTransforms[BoneIndex[0]] * BoneWeights[0]
{
+
          + BoneTransforms[BoneIndices[1]] * BoneWeights[1]
    mat4 skin = BoneTransforms[BoneIndices[0]] * BoneWeights[0]
+
          + BoneTransforms[BoneIndices[2]] * BoneWeights[2]
              + BoneTransforms[BoneIndices[1]] * BoneWeights[1]
+
          + BoneTransforms[BoneIndices[3]] * BoneWeights[3];  
              + BoneTransforms[BoneIndices[2]] * BoneWeights[2]
 
              + BoneTransforms[BoneIndices[3]] * BoneWeights[3];  
 
  
    gl_Position = Projection * View * World * skin * vec4(Position, 1);  
+
gl_Position = Projection * View * World * skin * vec4(Position, 1);  
}
 
 
</source>
 
</source>
 
== 関連項目 ==
 
* [[スキンメッシュ]]
 
 
[[category: 3DCG]]
 

MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMonoBook:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)