前回の投稿から
既に3,4年も経っていたりします。
ということで超ひさしぶりです(^_^;)
技術的な興味から始めたこのシリーズですが、
やりたいことは大体実現できたりしてるので、
もう打ち止めにするつもりだったのですが、
ひとつだけ心残りだったのが SDEF の実装。
SDEF は Spherical Deform の略だと思われますが、
Spherical Blend Skinning (SBS) と言う方が通りが良いようです。
MMD には BDEF というのもあり、
なんの略かはっきしりないのですが、
Bone Deform かな?
こちらは Linear Blend Skinning (LBS) ということになると思います。
改めて Skinning について説明すると、
頂点の集まりである3Dモデルに骨格構造を導入し、
骨の動きに応じて良い感じに頂点を補間し、
連続的で滑らかな体表面を表現する手法、
ということで良いかと思われます。
具体的には、
各頂点に対して複数の骨(ボーン)からの
影響度(重み)を設定し、
適切に補間計算することで表現する
という感じになります。
頂点に対して影響するボーンの数は、
最大で4つくらいが相場(?)のようです。
なお、それぞれの重みの合計は、
基本的には「1」になるように調整されます。
ちょっと説明が長くなってしまいましたが、
要するにポイントは、
BDEFは 線形(Linear)補間、
SDEFは 球状(Spherical)補間になる
ということです。
そして、BDEFでは都合が悪い頂点とかあったりするので、
部分的に SDEF を使って改善する
というのが導入意図だと思われます。
BDEF と SDEF の違いは
こちらによると以下のような感じになるそうです。
なるほど、補間がきれいになってますね。
実装にあたって、
線形補間は重みで積和計算するだけなので簡単なのですが、
こちらに書かれているように球状補間は少々複雑です。
実際にはシェーダーで処理することになるので、
BDEFに比べて計算量が大きくなります。
また頂点情報として、
影響するボーンと重みだけでなく、
球状補間するための回転中心点が追加で必要となります。
シェーダーへ入力するためのデータ量が増えるわけです。
MMDのPMX仕様ではSDEFの場合、
影響するボーンが2つとそれぞれの重み値、
回転中心点として SDEF-C なる値と、
それに加えて SDEF-R0, SDEF-R1 という謎の値があります。
それぞれ float 3つから成るので、
何らかの頂点値を表しているものと思われますが、
MMD独特の仕様のようで、何を意味しているかは不明です。
ということで、
どうやって実装すれば良いのか
ネットの情報を漁ったりしたわけですが、
色々と紆余曲折があり、長くなりそうなので
この続きは次回以降で書きます(^_^;)
ところで、
実は「MMDビューワー改」という形で
成果物をほぼ完成させたりしてあるのですが、
次回の投稿以降に公開する予定でいます。
↓スクリーンショットだけちょっと載せてみます。