This Page

スキニング

いよいよメッシュをアニメーションさせる。 ボーンを敢えて頂点配列でアニメーションさせていたのはここを簡単にするためだった。ボーンの時と違うのは、ひとつの頂点が2つのボーンの影響を受けるかもしれないという点。 コード的に違いは以下のようになる。

# Vは頂点。 # V.posは変形前の位置。4x4行列とかけるため同次表現になっている(x, y, z, 1) # V.bone0は頂点が変形される骨への参照 # V.bone1は頂点が変形される2つめの骨への参照 # V.weight0は頂点が1つめの骨で変形される割合0~1。PMDでは1つの頂点を変形する # 骨の数が2個までと決まっているのでウェイトが1つあれば残りは引き算で出せる。 # 合計で1という前提。

# ウェイト無し deformed = V.pos * getMatrix(V.bone0)

# 2ウェイト deformed =

V.pos * getMatrix(V.bone0) * weight0 + V.pos * getMatrix(v.bone1) * (1.0-weight0)

<%= source_view(‘PMDBoneBVHmotion.py’) %>

<%= player(‘pmdbvhwalk.mp4’, 320, 240) %> モーションはセカンドライフの歩きモーションから拝借

スキニングはうまくいっている(骨にメッシュがついてきている)のだが、異なるボーンにモーションを流し込むのが不完全なのでちょっと残念な結果に。

BVHとPMDのバインドポーズの違いで肩の角度がおかしくなっている。BVHはTスタンスなのだがPMDは手を斜めに下ろしたポーズなのでモーションにその回転差分の下駄を履かせてやる必要があると思われる。考えてみれば当然だが、やってみるまで気づかなかったw この件はプログラムで吸収するよりモーションを扱えるツールで何とかした方がよいのではなかろうか、ということでとりあえず放置。

もうひとつ、劇的に速度が低下してうちの環境では7~8FPSになった。ソフトウェアスキニングをpythonでやっているので当然の結果だがちょっとつらい。とりあえず最後までpythonでやってからc++モジュール化しようと思う。

inserted by FC2 system