剛体とjointに悪戦苦闘した話



時は2024/10/05。





私はBlenderでローターのモデリングをしていた。

ローターはいいぞぉ。ヴヴヴヴヴヴヴヴヴヴヴ。

私の数々のえっちなMMD作品を見て頂ければ分かる通りとにかくローターと電マが大好き。
既に他の方が作ってくれたローターがあり私はずっとそれを愛用させて頂いていたのですが・・・。
今目指している目標として使っているモデルを全て自作に置き換えるという野望がございまして・・・。
ローターは今後も沢山使う事になるモデルなのでこの機会にモデリングを開始したという訳です。

これまで電マを始めとして、ビジネスホテルっぽい部屋や電マアタッチメントに粘着テープ、後表側のサイト更新で人物モデリングとか色々作ってきましたが・・・
実はMMDに持って行ったモデル達全てどれも剛体(物理)が入っていなく、物理関連の設定は全くの初心者という状態です。
物理関連はBlenderで設定するのではなく、MMD(pmxeditor)で設定する必要があるのでこれに関してはBlender知識が全く生かされない所になります。
しかし将来的に人物モデリングとかするのにおいて髪の毛とかスカートとか物理は切っても切れない関係にあるのでいつかは覚えなければいけなかった所です。
そういう意味で将来的にもっと難しい所に行く前にシンプル(?)なローターで一回練習も兼ねてたりもします。
で今回色々挑戦してかなり悪戦苦闘したんですが何とか物にはなったので備忘録かねてこの記事をまとめています。

とりあえず物理の勉強をするにしても物がないといけないのでモデリングに加えてボーンとウェイトの設定をちゃちゃっと済ませます。



というわけでボーンとウェイト周りの設定は完了。
リモコンとバイブの所は操作するボーンとし、真ん中のコードの所が物理で揺れる所になります。厳密にはボーンの位置がある所が物理で揺れるという訳ですね。
コードの所は頂点がある所に全部ボーンを仕込んでいます。辺単位で見ていますが頂点は合計で44頂点ありボーンも合計44あるといった感じですね。




着色もとりあえず完了。
シンプルながらも悪くはない。スフィアとトーン適当に貼ればそれっぽくなるのでありがたい。

さてさて、本番はここからです。
出来上がったこのモデルに物理を仕込まねばなりません。
今回真ん中のコードの所に物理を仕込みたいと思っています。

ボーン構造的には

リモコン→コード→コード→(繰り返し)→コード中間点←コード←コード←(繰り返し)←コード←バイブ  みたいな構造になっています。左右から真ん中に向かってボーンの矢印が進んでいます。
物理で揺れるコードを支えるリモコンとバイブの部分に加えて物理で揺れるコードの箇所のボーン全部を選択し、その後 選択ボーンから基礎剛体/基礎jointの作成を選択して剛体とjointを作成します。




画像では回転スイッチが選択されていませんがこれは物理で揺れる箇所でもなく、また物理で揺れるボーンとも繋がっていないので選択しなくてもいいといった感じですね。

基礎剛体と連結jointを作成するとボーンの位置に剛体、その剛体と剛体の間に剛体を繋ぐjointが作成されます。
文字に起こすと

剛体-joint-剛体-joint-剛体

みたいな感じですね。チェーンで物を繋いでるイメージです。なお、jointは必ず両側に実在する剛体が存在している必要があります。
例えば片方でも接続先の存在していないjointがあるとMMDは強制終了します。上記手順に従って作業するとリモコンとバイブで剛体の接続されていないjointが二つ存在するためそれらは削除します。
更に今バイブから伸びてるコードの剛体とリモコン側から伸びてるコードの剛体の間がjointで繋がれていないのでどちらかのボーンを選択して基礎jointを作成し、joint画面から二つの端の剛体をjointでつなぎ合わせておきます。
イメージ的には宙ぶらりんになってる二本の紐をきっちりつなぎ留めておくという感じですかね。

また、このままだとリモコンもバイブも全部物理で揺れる対象となってしまうので、リモコンとバイブは自分の手(?)で動かす所になるのでpmxeditorの剛体タブからリモコンとバイブの所をボーン追従にします。



コードの所は物理演算を選択しています。
こうすることでローターとボーンは揺れず、真ん中のコードの所だけが物理演算によってゆらゆらと揺れる訳ですね。

最後に全部選択して非衝突グループの1にチェック入れておきます。
これは同じグループに所属している剛体同士は当たり判定として認識しないようにしておく設定になります。
今右の画面的にはぶつかってはいませんが向きを整えて一本の線になるようにしたら剛体同士がぶつかり、同じコードなのに当たり判定として接触しまくって大暴れするこおtになります。それを回避するために全部同じグループにして指定した非衝突グループにチェックを入れておくという訳ですね。
これが人物であれば例えば髪の毛のグループは2にして、体は1とかにすれば髪の毛同士は当たり判定としてぶつからず、肩や頭にぶつかったら乗っかったり逸れたりするようにする訳ですね。今回ローターに関しては全部同じグループでも良さそうです。


さて、一応設定的にはこれでお終いっちゃお終いです。


が、この状態で動かすと・・・・






大暴れ。




何もしていないのにコードは荒ぶりまくり、中間点を繋ぐ紐も無秩序に伸びまくってとてもじゃありませんが自然な形で揺れる事はありません。
そう、ここまでは基礎設定でありこの先で物理の揺れ方を制御する回転制限や揺れ方に影響を与える質量が減衰の設定をしていかなければなりません。
そして今回私が苦戦したのはまさにこの部分で適切な値を入れていかないとこの荒ぶるコードを治める事が出来ないのです。
ただどうすればこれを治める事が出来るのか、知識として知っておくべき事を知っていないとマジで無理ゲーなのでそれを次回まとめます。今日はここまで書くのに思ったより時間かかっちゃった・・・・。





ここから10/10に追加更新した内容。


さてさて。前回ローターのモデリングまで行って剛体の作成とJointの作成までやった所で終わりました。
が、この状態で動かしても何も動かしていないのにコードは大暴れ。とてもじゃないですがこのままでは実用性に乏しいものに。
MMDやる上でここからが本番・・・らしい、剛体とJointの調整に入るという訳です。


さて、先に結論から記載すると下記の事を実践したら非常に綺麗になりました。


1.ボーン追従剛体→物理剛体→物理剛体→... ってなってる所の質量を 1→0.9→0.8→... っと子に向かうにつれて小さくする。
2.剛体のサイズそのものを0.3以上にした。(小さすぎると荒ぶるらしい)
3.jointを複数入れる
4.逆jointを入れる(効果絶大だった)


一つずつ解説していきます。ただいずれも理屈は分かっていません。




1.ボーン追従剛体→物理剛体→物理剛体→... ってなってる所の質量を 1→0.9→0.8→... っと子に向かうにつれて小さくする。



これは単純でそのまんま端に向かうにつれて質量の値を小さくするだけです。
例えば今回のローターの例だとローター001の質量を1として、002は0.96、003は0.92と端(今回の場合コードの真ん中ですが)に向かうにつれて質量の値を小さくしていきました。
ローターに限って言えばボーンがリモコン側とバイブ側両方からコードの中央に向かって伸びてってるのでそれぞれバイブ、リモコンがある方を質量を1として中央に向かうにつれて質量の値を小さくしていった形ですね。

これをやるだけでも少しコードの粗ぶりは改善しましたがまだ完璧とは程遠い状態でした。



2.剛体のサイズそのものを0.3以上にした。(小さすぎると荒ぶるらしい)

上のスクショに半径という項目があり、そのスクショ内では0.3と書いてある部分がそれです。
これはTwitterで見つけた情報ですが揺らす用として割り切って剛体を大きくする(衝突判定は消した上で)ことで揺れが安定するらしいです。
この後のjointにも関わってくる話なのですがMMDのjointは剛体が小さいほど弱まって溶けるらしいです。ちょっと溶けるの意味を完全には理解していないのですが繋げる力が弱まるって感じなんですかね?
ある程度質量を大きくすることでその分がっしり紐づくんですかね・・・。この辺の仕組みが良く分かってはいませんが質量を大きくしたらまた少しコードの粗ぶりが改善しました。が、それでもまだ改善には至らずって感じですね。



3.jointを複数入れる

これもシンプルな話で単純にJointを何重にもかけていくやり方です。輪ゴム一つじゃ留める力足りないならいくつも使えばいいじゃない戦法。
別に一つの剛体に対し複数のjointで何十にもつなぎとめていいらしいです。
で、それをやるならぜひ下のをやってみてという話になるのですが



4.逆jointを入れる(効果絶大だった)

この逆Jointが効果絶大でした。(人によっては裏Jointとか言うらしい)
逆Jointというのは通常Jointは例えば髪の毛で例をあげるなら 頭→髪の毛の物理用ボーン1→髪の毛の物理用ボーン2 みたいな大元の所から先に向かってJointを繋いでいくのが基本ですが、反対に 髪の毛の物理用ボーン2→髪の毛の物理用ボーン1→頭 みたいに反対側からもJointをかける事です。
通常のJointに加えて逆方向のJointも加わるので実質3の複数Jointを入れる事にもなりますね。
互いが互いにきっちり引っ張り合うことで揺れが安定するらしいです。



スクショはリモコン側とバイブ側からそれぞれjointを順々に繋ぎとめ、最後に左右から伸びてきたものを中間部分でまたしっかりjointで結んでいた所に更に逆Jointが続いていってる図です(途中で途切れてるけど
逆Jointは闇鍋プラグインで配布されているのでこれで設定すると簡単。

どうして逆Jointをすると安定するのか。
ここに詳しく解説されていたのでぜひ読んでみてください(丸投げするな

https://q-ku.blog.jp/archives/11315481.html

すごくざっくり説明すると通常のJointだけを設定すると例えばコード001が動くとその動いたことに夜揺れが001→002→003へと伝搬していくけど、何らかの要因でその先の010とか011が動いた場合、それが根本川の009や008には伝搬しないので逆Jointを仕掛ける事で正しく伝搬し安定する・・・らしい・・・。なるほど、わからん。
これは今回のローターのように非常に長い多段ボーン物理において絶大な効力を発揮するそうです。実際この逆Jointを設定するだけで滅茶苦茶動きが安定しました。



ご覧の通り綺麗な弧を描くように・・・。理想的な物理です。
一応逆Jointだけのパターンも試したんですが質量を徐々に小さくする設定や剛体のサイズ調整を行った方が安定していたのでいずれも効果はあるようです。


恐らくこの剛体とJointは人物モデリングの時に再び向き合わねばならない設定なので今のうちに予習できたのはよかったです。
髪の毛とかスカートとかで似たような事で苦戦する事になると思うので、この時に経験したことを活かしたいと思います。
ただスカートとかの場合ふんわりスカートにしようとしたら今度は回転制限とか移動制限とかこのローターのコードの時には考慮しなかったことや横Jointなる新しい技を使わなくてはいけなかったりまた調べなくてはならない事が多そうなんですよね・・・。
どっかでスカートだけのモデリングをやってその物理の練習をやらないとですねぇ・・・・。

というわけで自分の備忘録用のローターでの剛体とJointについてのまとめは以上です。



の、はずでしたが。



ここから先は前回更新から1ヶ月後の記事。2024/11/07加筆となります。

自分で作ったローターをさっそくMMDで使おうとしたらですね・・・。




なんか床の上に置いたらすごいコードがギザギザに。
※光っててまっすぐ伸びてるローターは仮対処後のものです。

これなんでこうなってしまっているのかというと・・・。



剛体がこのようになっていて球体サイズになっているんですよね。で、ちょうど剛体の上らへんをコードが通るような感じになっていまして結果的にそれがギザギザとなっているんですかねぇ。
正直これは完全に盲点でした。MMDの地面の剛体グループって16番なんで非接触グループ16とかにチェック入れればいいんかと思いましたがそうすると今度は床をすり抜けてしまうはずなので意図した通りにはならなくなってしまいます。

これはしっかり剛体を整えてあげる必要がある・・・・ということでもうちょっと剛体と戦うことに。
早い話、コードの剛体のサイズがバイブやリモコンより大きくて剛体と剛体の間が結果的に凸凹とした形になっているのがよくないので球体からカプセル状とかにして高さを抑えてみました。

が、そうすると以前に述べた剛体のサイズが小さすぎると物理が荒ぶるという問題が再発。
単純に小さくするだけでは別の問題が発生してしまうようです。
とにかくコードがギザギザにさえならなければよく、別にローター内で剛体同士が接触して当たり判定を生じさせるようなものはないので、高さは抑えつつも横方向に剛体を伸ばして強引に体積を広げてみたらどうかということで実践。



設定的にはこんな漢字。半径を小さくしつつも高さを大きくすることで結果的に剛体の体積を増やしている形です。
これが功を奏し・・・



見事この光っているローターの通りきれいにまっすぐ地面の上を這うようになってくれました。
これで今度こそめでたしめでたし・・・・。


とは行かなかったんですよねぇ。

また新しい問題が生じまして、確かにコードはギザギザせずまっすぐ地面の上を這うようにはなりましたがなぜか地面の上にあるコードが勝手にゆらゆらと地面の上をのたうち回り始めました。


怪奇現象かな?



それが些細な動きで凝視することでやっときづけるとかならまぁ無視出来たかもしれませんが思っていたより大きくうねって動くものなので流石に許容出来るレベルを超えていました。

なんでうねってしまうのか、流石に原因がわからず摩擦力を上げてみたり質量を再度調整してみたりするもののうまくいかず。
物理的にボーンがどう動いてしまっているのか解析するために一度MMD上で物理で動いているコードのボーンを操作できるようにしてボーンの値を凝視していたところ・・・
なんかZ軸にボーンがぐるぐる回っていることに気づきました。現実で言えばコードが回転しまくって捻れまくっている感じ。

最初にJointの設定をしたとき、XYZ軸全部において-72〜72の範囲で回転制限を加えていました。その結果、XYはともかく回転する必要ないZ軸方向に何らかの理由で回転が加わり、そして捻れたコードをより戻して解消するかのように反対方向にZ軸が回転。その回転によって地面の上を転がるものの、再び回転制限以上にネジ曲がるものだから更に反対側に向かって捻れを解消するかのように回転。それが延々とループしてしまってまるで地面の上をコードがゆらゆらと地面の上をのたうちまわってしまっていたという訳です。はぁ〜〜〜地面の上を転がるほどちゃんとしっかり物理演算していたとは気づかなかった。

であるならば解決策を見出すのは簡単。単純に・・・



Z軸の回転制限を0にしてやりました。ついでにXY軸の回転制限も緩すぎて直角にコードが曲がってしまっていたのでちょっときつめに制限をかけ直しました。
その結果・・・



無事コードが地面の上をのたうち回る事もなくなり、更に緩やかな曲線を描くようにもなりました。
これこれ、この形を俺は望んでいたんだよ〜〜〜〜。

今後のローター責めが捗るというものです(真摯スマイル


恐らく将来的に髪の毛とかスカートとか作るときにこのZ軸の回転制限とかちゃんと意識しておかないと大変な目に合うと思うのでここでロジックを理解出来たのはよかったと思います。
最近は仕事でなかなか新しい創作活動に望めていないですが何とか一息ついたら再開したいところです。

というわけで今度こそこの記事はここまで!


戻る