白チャイカ作った時にヤバイ級トラブルインシデントに遭遇、今後のインストラクションとして記す次第。
落ちるンです
白チャイカ公開後、白チャイカをMMDに読み込んだ後にモーションを再生すると強制終了するというタレコミを頂いて、わりと致命的な不具合にびびりながら動作テスト。
そしたらもう、慈悲は無いとばかりに落ちたわ。強制終了ね。胃が痛くなったわ。
余談:
ウェイトミスとか、モーフが抜けとか、そんなチャチなもんじゃあ断じてねえ。もっと恐ろしいものの片鱗を味わったぜ…
普段はMikuMikuMovingの方を使っててて、テストもそっちメインなの。MikuMikuDanceは読み込みしてちゃんと表示されるかくらいしか確認してなかったのが問題の発見を遅らせてしまった要因ね。
原因
今回の問題の原因は、剛体のサイズ指定にマイナス値が入っていたというものだったわ。
PmxEditor や MikuMikuMoving、それと MikuMikuDance でも剛体表示した際はちゃんと表示されてるし、PmxEditor でも「PMXデータの状態検証」でも警告は出てなかった(検証対象に含まれていなかった)から、うっかり見落とすのも仕方ないんじゃね? と。
何かの拍子にマイナス値を入力してしまって、そのまま剛体の調整が終わってしまったら、多分、二度と注目する事の無いパラメータだから、そういうヤバイ事例があるって事を意識しないと今後も同じミスをしてしまいそうだわね。
症状
サイズ指定にマイナス値が入っていた場合、先に述べたようにMMDが強制終了するんだけど、これは物理演算をしている時に起こるみたいね。
MMDの物理をOFFにすると強制終了しなくなるわ。
ちなみに、モーション再生中に強制終了するのが見つかった時の再現条件だったけど、実際は再生中以外でも物理演算していれば強制終了することを検証中に何度か確認しているわ。
強制終了のタイミングは、マイナス値の入っている剛体が他の剛体に衝突した時のようなんだけど、簡易なモデルを作ったテストでは再現できなかったのね。
単純に、マイナス値が入っていれば必ず落ちるというわけでもなさそう。
白チャイカモデルでも検証のために剛体やジョイントを減らしたりしていたら強制終了のタイミングがまばらになったり、なかなか強制終了しなくなったりしたから、実際にはマイナス値が入っているというだけでは不具合は起きないのかもしれないわね。
ただ、マイナス値は物理演算の仕様としては不適切な値だから、不具合が出なくてもマイナス値を設定してしまわないように注意が必要ね。
いつ問題が出てくるかわからないし、出てからだと原因を探すのも一苦労よ。
不具合の特定方法
以下の条件に当てはまったら、マイナス値が入っている可能性があるわ。
- 物理演算対応のモデルを使ってモーションを再生している時にMMDが強制終了する事がある。
- MMDのメニュー「物理演算」→「演算しない」をONにしてモーションを再生した場合は強制終了しない。
※10分以上のループ再生を推奨
おまけ:当時の様子(一部)
うちのチャイカさんをMMDに読み込んでモーション再生すると確実に落ちるの確認しましたあばばばば(白目
MMMだと落ちないっぽい。
ぐぬぬ。— 神楽坂柚 (@k1468) 2016年9月5日
タレコミいただいて確認。強制終了コワイ!
ボーン設定に余計なフラグ立ってたから解除してみたけど、落ちるまでの時間が伸びただけで原因は他にもあるくさい pic.twitter.com/hzxrKwDM3S
— 神楽坂柚 (@k1468) 2016年9月6日
とりあえずpmxファイルの中身を再確認して、余計な設定とかもろもろ削除。MMDは余計な事すると不機嫌になるのです。
物理切ったら落ちなくなったヨー
…pmxの物理設定か!?— 神楽坂柚 (@k1468) 2016年9月6日
要素ごとの検証で、モーフとか剛体とか削って動作確認してた時。
エラーが発生するアドレスはわかってるけど、ソースコード無いからそこで何やってるかわからんくてもにょる
逆アセンブルされたコード見てもサッパリじゃーハハハ— 神楽坂柚 (@k1468) 2016年9月6日
VisualStudioのデバッガー使えば何かわかるんじゃね? と。
とりあえず、プログラム内の同じ場所で発生するのはわかった。
やったか!? #やってない
— 神楽坂柚 (@k1468) 2016年9月7日
というのをパラメータいじってテストしてと5分くらいの間隔で繰り返してるなう
— 神楽坂柚 (@k1468) 2016年9月7日
デバッグ中のチャメシ・インシデント。地味につらい。
今のところ、落ちる最小の物理構成は下半身+スカート+ポーチ。
ここからスカートかポーチ外した場合は落ちない。
・・・なんでやねん。— 神楽坂柚 (@k1468) 2016年9月7日
問題が発生する状況をシンプルにすると原因を特定しやすくなるんデス。
ざわ・・・
ざわ・・・ pic.twitter.com/2qcGRJRcZ8— 神楽坂柚 (@k1468) 2016年9月8日
だいぶ減らした剛体とジョイントの中身を改めて確認した時、それは見つかったのです。(でも画像は上半身)
上半身とポーチの剛体のサイズにマイナス値ががが
— 神楽坂柚 (@k1468) 2016年9月8日
最終的に、2カ所はいってた。まさかのマイナス値である。