物理チュートリアル

物理セットアップは初めて!という人のために、セットアップのやり方を順を追って解説します。

物理構造の構成要素


MMDモデルを物理対応するには、剛体とジョイントの2種類をモデルに組み込みます。

剛体

物理判定の主役になる物体です。
剛体には幾つか種類があって、それぞれ以下のような関係になります。

ボーン追従 ボーンに従って剛体が動く
物理演算 剛体に従ってボーンが動く
物理+位置合わせ 剛体に従ってボーンが動く

これらのうち、「物理」のついた剛体が動く部分になります。
「ボーン追従」の剛体は直接物理法則に従って動くわけではなく、他の剛体に対する当たり判定みたいなものです。
髪が顔や体を貫通しないようにしたり、スカートの動きを抑制して防御力を高めたりと、細かい制御にも使われます。

ジョイント

ジョイントは、剛体と剛体をつなぐ役目を持っており、主に物理剛体を接続するのに使います。
何故かPMD Editorでは一貫してJointと記述されています。

ジョイントは剛体と剛体を接続するためのものですから、必ず2つの剛体と関連付けられなければなりません。
ジョイントの接続されていないPMDモデルを動かそうとすると、MMDやPMDEは強制終了します。

PMD Editor上の表示や細かい設定要素については、剛体とジョイントの構成要素を参照して下さい。

基礎剛体とジョイントの生成


まずは、一通りボーンに剛体をくっつける作業からです。
PMD Editorには、一括で剛体とジョイントを生成する機能があるので、ここではそれを利用します。

剛体生成対象のボーンを選択した状態。
指や袖、ダミーボーンや捻りボーンには
剛体は必要ないので選択しません。

ボーンを選択したら、メニューから「基礎剛体/連結Jointの作成」を選んで下さい。

ここ。

選んだボーンに沿って、剛体とそれらを接続するジョイントが出来上がります。

生成された剛体とジョイント。

もちろん、このままでは使い物になりません。
ここから問題を一つ一つ解決して、完成に近づけていくことになります。

なお、剛体の順番は自動生成のままだと結構ばらばらです。
後の作業が楽になるよう、ここで並べ替えておきましょう。

不正ジョイント処理


基礎剛体/ジョイント生成後最初の作業が、不正ジョイントの処理です。
自動生成直後の状態では不完全なジョイントが存在し、このままモデルを保存して再生しようとすると、MMDやPMDEは強制終了してしまいます。

不正なジョイントの例。
片側が空白になっています。

修正方法は至って簡単、Jointリストの「->」両側が全て埋まるようにすればOK。
関連剛体がどちらもボーン追従型の場合、ジョイントは必要ありません。
そのようなジョイントは削除してしまいましょう。

その他の正しく繋がっていないジョイントは、設定されていない方の接続剛体ボタンから、目当ての剛体を選んで下さい。

ボーン追従剛体の設定


これでアプリが落ちることは避けられますが、かわりに剛体がボトボト落ちます。
初期状態では全ての剛体が物理優先になっている為で、これでは剛体がボーンの支えを受けられません。
つまりは軟体動物みたいなものです。

ボーンの支えがなければこの通り。

そこで、腕や足、頭といった部分をボーン追従設定にします。

物理演算になっている部分を…
ボーン追従に。

VMDViewやMMDで再生してみて、パーツが飛んで行かなければOK。

ボーン追従剛体は、ここで形状や大きさを見た目に合わせて調整しておきましょう。

剛体の荒ぶりを低減する


さて、ここからが本題です。
自動生成されたばかりの剛体は全く最適化されていないので、髪やスカートはどうしようもなく暴れてるはずです。

止め絵だとわかりづらいですが… こんな状態です。

MMDerを悩ませるこの「荒ぶり」ですが、原因は幾つかあります。

ジョイントの部分で関連剛体が干渉している


剛体が初期位置、特にジョイントの繋ぎ目で干渉している場合です。
物理演算が始まると干渉している剛体は反発し合いますが、ジョイントから離れた剛体は元の位置に戻ろうとするので、ずっと反発と衝突を繰り返すことになります。

この現象の回避方法は以下の通り。

非衝突グループ化する

髪をグループ2にして、
かつグループ2の当たり判定を消した例。

剛体はそれぞれ1~16までのグループに属し、剛体ごとに衝突判定を行うグループ・行わないグループを選べるようになっています。
髪を1つのグループにまとめ、そのグループ自身を非衝突に設定すれば、髪の剛体同士が干渉することはなくなるという事です。
ツインテールのような剛体なら、この方法が一番手っ取り早く綺麗にできます。
左右のツインテールのグループを別々にするかどうかはお好みで。

剛体の形状・大きさを調節する

非衝突グループにすると都合が悪い場合は、剛体をジョイントで重ならないように調整してやらなければなりません。
剛体の形状は初期状態では「カプセル」ですが、他に「箱」と「球」の2種類があります。
違うのは当たり判定の形状くらいなので、それぞれ適切なものを選んで下さい。
例えば「箱」は、薄い板状にしてスカートの剛体を作るのみ向いています。
剛体の大きさは、ジョイントとの間を0.1、つまり反対側の剛体までの距離なら0.2くらい開けると挙動が落ち着きます。
ただ、剛体を小さくするというのは当たり判定が小さくなるということでもあります。
それだけ貫通の可能性が高くなることに注意して下さい。

余り髪には向いた方法ではありません。

左からカプセル、箱、球。

ボーン位置合わせを設定する

剛体が干渉している場合、ジョイントの移動制限を0(移動不可)に設定しても演算の結果によってボーンが移動してしまいます。
回転のみのボーンで移動が起こる場合さえあります。
これはBulletの仕様状の問題で、そのためMMDでは「ボーン位置合わせ」という機能が用意されています。
ボーン位置合わせを設定すると、物理演算後にずれたボーンが強制的に本来許容される範囲まで移動させられます。
ただし、この機能はBulletの外で物理ボーンの挙動を制御することになるため、激しい振動の原因になります。
ジョイントのずれは可能な限り非衝突グループで対処し、位置合わせの使用はどうしても必要な部分に抑えたほうが無難です。

ジョイントの回転・移動制限に引っかかっている


剛体がジョイントの回転制限に引っかかっている時も、剛体は振動します。
特に、剛体同士が接触して反発した時に回転制限以上に動こうとしたときは、剛体が激しく跳ね回ります。
これは、干渉を解決するために反発した剛体が回転制限を超え、それを解決するために更に反発し…というのを繰り返してしまうためです。
この場合は、回転制限の値を剛体に干渉しないところまで制限を強化するか、もしくは逆に剛体が乗り上げで跳ねても回転制限に引っかからないほど制限を緩くするかになります。

解決方法は以下の通り。

回転制限を緩やかにする

回転制限はそれ自体が剛体の振動の原因になります。
ですので、干渉がないような剛体は回転制限を極力緩くし、ばねで動きを規制したほうが振動は少なくなります。
ちなみに、ばねは質量の100~1000倍以上、剛体の回転減衰は0.99以上等の極端な値にしてやらないと効果が目に見えにくいです。

回転制限を厳しくする

前項とは逆の考え方になりますが、他の要因により激しい荒ぶりが起きているような場合は、多少振動があっても回転制限をかけたほうがマシという事も多いです。
基本的に回転制限による規制は妥協案で、最後の砦と思っておきましょう。

1つの剛体に対して、2つ以上の剛体が同時に干渉している


物理演算は、多数の剛体が同時に関与するような計算を苦手としています。
入り組んだ場所では3つ以上の剛体が絡みあって、複雑な挙動と意図しない巨大な反発が起きることが多々あります。

剛体を小さくする

干渉しないように剛体を小さくします。
見た目どおり当たり判定が欲しい場合は、当たり判定用の剛体を別グループで作って下さい。
関連する剛体からは非衝突に設定しておけば、当たり判定と荒ぶり防止を両立できます。

回転制限をかける

回転制限により、剛体の干渉自体を減らします。
ただし前述のように、剛体が接触するときのジョイント角度が回転制限角度に近いと、剛体が余計に激しく荒ぶる原因になります。
対処するときは剛体の接触を許すか、逆に回転制限で接触を完全に食い止めるかをはっきり決め、中途半端な値を取らないほうが簡単です。

剛体が別の剛体の上に乗っている


物理演算は、他の剛体に乗った剛体の位置が定まりにくい性質があります。
特に、ジョイントで他に接続された剛体が他の剛体の上に乗ったとき、位置が定まらずにゆらゆらと振動する事があります。

ボーン追従剛体
(頭とか)
ジョイント 物理剛体
ココ!

ボーン追従剛体
(頭とか)
ジョイント 物理剛体
ココ!
ジョイント 物理剛体

赤で示した部分が他の剛体の上に乗ったときは、極端に大きく暴れる事があります。
モデルの前髪やネクタイが振動してる場合、大抵これが原因です。

対処方法は以下の通り。

剛体を乗り上げ対象より下に移動する

剛体は、別に見た目の髪や物体と同じ場所に存在する必要はありません。
前髪のような他との当たり判定に意味のない剛体は、剛体自体を干渉エリアより下に動かしてしまうと振動を抑制できます。

前髪の剛体を大きくずらし、
更に回転制限をかけている

ジョイントの回転制限で乗り上げを回避する

衝突直前の角度でジョイントの回転制限をかけることで、乗り上げ自体を回避してしまう方法です。
ただし、前述のように回転制限はそれ自体が振動の原因になります。
また、回転制限はxyz軸それぞれでしか指定できないので、動きが不自由になるデメリットもあります。

ただ、前髪のように乗り上げ干渉の起きやすい剛体は、回転制限をかけないと頭を傾けた時に結局振動してしまいます。
剛体位置の変更と回転制限・ばね設定の両方で対策したほうがよいでしょう。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2012年04月13日 23:29
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。