Bulletでぬいぐるみを作ってみる Part1 簡易形状によるスキニング

SoftBodyを使って、ぬいぐるみを再現しみます。SoftBodyのポリゴン数に制限があるようなので、ローポリモデルをソフトボディーで動かし、その動きをハイポリモデルに反映するという方法を採用します。これでSoftBodyの制限回避と計算負荷を軽減しつつ、見た目の良いハイポリモデルを動かすことが可能になります。
今回、解説動画を作成しました。大まかな説明は動画で行って、ここではローポリとハイポリモデルの連動について解説します。

SoftBodyぬいぐるみ
SoftBodyぬいぐるみ


解説動画


簡易ポリゴンモデルと複雑なモデルの連動

SoftBodyはポリゴン数に制限があるようです。ためしに約2万ポリゴンを登録すると動作しませんでした。それと計算負荷の問題もあるので、ポリゴン数を少なく抑える必要があります。ゲームなどで使うとき、見た目の良いハイポリモデルを使用できません。そこで、SoftBodyで簡易モデル(ローポリモデル)を動かし、その動きを複雑なモデル(ハイポリモデル)に反映させることで解決します。

基本的な仕組み

ローポリモデル(SoftBody)を構成する三角形ポリゴンとハイポリモデルの頂点(複数)を対応付け、ローポリモデルの動きをそれぞれ対応する頂点に適応させます。
これは
「ボーン」=「ローポリモデルの三角形ポリゴン」
「スキン」=「ハイポリモデル」
とした、ボーンによるスキン変形と同じ処理になります。
ボーン数の制限に注意が必要ですが、既存のグラフィック処理をそのまま使用できます。(DX11では1つの定数バッファに約1300ボーン)

対応付け=ボーンウエイト付け

3Dモデラーなどではウエイト付けができない(もしかしたらあるかも)ため、プログラムで自動的に割り振り。ローポリモデルのポリゴンとハイポリモデルの頂点の距離を計算し、近いものを対応付け、ウエイトは距離に反比例。詳しくは下記のソースコードを(関数AssignTriangle)。

SoftBodyから三角形ポリゴン取得

SoftBodyは三角形ポリゴンで構成(三角錐もあるが今回未使用)されているため、その情報を取得するのみ。三角形ポリゴンから姿勢行列が求められるため、初期姿勢行列との差分をボーンによるスキン変形処理へ(ソースコード関数GetSoftBodySkinningPose)。


ソースコード

一部モデルデータ取得設定関連の処理がありますが、このソースコードを見れば、おおまか処理の流れや、ウエイト付け計算が理解できると思います。

(追記2014/6/1) SoftBodyのノード(頂点)位置取得にm_qを使っていますが、正しくはm_xです。サンプルの更新はしていません。


サンプルプログラム

解説動画を作るためのプログラムが大半を占めますが、今回説明した内容に対応する処理は、zg_sbskin.cppに書いてあります(上記のソースコード)。
※128式ミクダヨーさん Ver. 1.70はサンプルプログラムには含まれません

Bulletでぬいぐるみを作ってみる Part1

リンクなど

Bullet Physics Library

http://bulletphysics.org/

128式ミクダヨーさん Ver. 1.70

【ニコニコ動画】【MMD】知られざるダヨー 【モデル配布】

PMXモデルデータ仕様

「PMXエディタ」 / とある工房

3Dモデリングソフトウェア「Metasequoia 4」

http://metaseq.net/jp/

動画制作ツール

【ニコニコ動画】ゆっくり実況がすごく簡単に作れるようになった【ゆっくりMovieMaker3】

動画BGM

【ニコニコ動画】PCエンジンで TOWN(アイドルマスター)を演奏してってってー

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.