当たったらどうすんだよ

当たらなければどうということはない

ZBとBlenderでUE4用のキャラを作る #番外編:Blenderボーンの軸について

はじめに

今回の記事は研究途中のものです。追加でテストを行っていかないと確かな情報とは言えません。また、各ソフトウエアやゲームエンジン、あるいはファイルフォーマットの仕様変更や更新によって、あっと言う間に「旧い情報」と化すかもしれません。それらを踏まえたうえでご覧くださるようお願いいたします。

Blenderのボーン軸

f:id:kanianthi:20160614195118j:plain

統合型3D CGツールを、Blender以外は触った経験がない方にはなんの不思議もない問題ですが、↑の画像で示した通り、Blenderのボーンはローカルの軸が「Y軸をロール(ツイスト)回転」として設定されています。

またBlenderに標準で備わる機能ではこの回転軸を変更する方法は(ぼくが知る限り)ありません。ですので人体の手足リグを組むさいには、主な回転方向(腕を上げる、膝を曲げるなど)をX回転として設定し、手のひらを反すなどのネジリ方向の回転はY軸回転に必ずなります。

Maya2016のボーン軸

f:id:kanianthi:20160614195948j:plain

続いて統合型3D CGツールの世界ではトップシェアを誇るMayaのボーンです。画像では少し分かりにくいかも知れませんが、X軸がロール回転座標系です。

過去にぼくが触れたことのある大半のCGツールは、Mayaと同じように「X軸ロール」でした。ですので「肩の関節がねじりで破たんするんだよねー」みたいな話題が出ると、それはX軸回転の問題でした。

しかし、BlenderのボーンロールがY軸回転であることは、将来的に他のソフトとボーンアニメーションのやりとりを行うときに、なにか問題が起きるのでは?と心配せずにはいられない事実だったのです。

一般的なスケルトンアニメーションは問題なし

UE4やUnityあるいはCry Engineなども、標準的なアセット作成ツールとしてMayaを挙げているかと思います。当然、Blenderでゲームアセット作成というのは日本国内ではかなりの少数派でしょう。

しかしBlenderでもできないことはない、どころか、一部の機能では他のソフトに優っている面もありますし、ちょっとした工夫を加えることで、それまでBlenderでは実現しにくかった工程があっさり改善されたり、頻繁なアップデートによって激しく機能改善されているのがBlenderの面白さです。

過去の経験から言っても、かなり複雑なモーションを必要とするキャラクタアセット作成においてでさえ、Blenderのパフォーマンスに不満を持ったことはありませんでした。前記したボーン軸の問題にしても、Blender内できちんと動作するアニメーションであれば、UE4にインポートしても(オペレーターがミスをしない限り)どのような問題もなかったのです。

物理アセットではどうか?

ただし…UE4ではビークルというアセットテンプレートが最初から用意されていて、仕様通りにメッシュとボーンを組めば、そのまま「全身が物理で動く自動車」などとして動作させることが可能です。

こうした物理アセットは、基本の骨組みはBlenderで作成できますが、ゲーム(レベル)内での動きはUE4に備わる物理エンジン(Phisics Engine)に委ねられる「プロシージャルモーション」として、その都度計算されながら再生されます。

ぼく自身が過去に「大ハマり」を食らった例として、このビークルBlenderで作成してUE4で動かそうとした例があります。

f:id:kanianthi:20160614202743j:plain

具体的には、上記のように作成した「かんたん自動車」が物理シミュレーションを開始するとタイヤが「90度横を向いてしまう→ホバーかよ!」という状態だったのです。

とっさに思いつくのがUE4の物理エンジンはボーンのロール軸をX回転にしないと正常動作しないのでは?でした。

この「90度の傾き」問題について、当時はUE4内のスケルタルトランスフォームのノードかなにかを使ってなんとか対処しました。しかし、どうしても物理判定用のコリジョンが言うことを聞いてくれず、海外フォーラムにも同様の問題提起がされているのを見つけてはいたのですが、当時は「Maya使えばいいんじゃね?」という、根本的にはなんの解決にもなっていない状況であきらめざるを得ませんでした。

そして再び物理アセットを…

Twitterで少しつぶやいたのでご覧になった方もいるかも知れませんが、UE4.11から、AnimDynamicsというノードを使って、今までよりずっとお手軽に物理を使った揺れモノをキャラクタに導入することができるようになりました。

もともと、今回の連載でワサビミドリさんの「ワサビ型オサゲ」などを、このAnimDynamicsで揺らすつもりでいましたので、昨夜そのテストをしていたのです。

しかし、まさに、アニメーションブループリントにアニムダイナミクスノードを導入し、物理シミュを始めた途端…あの忌まわしい「ボーンひっくり返ったよ問題」が再現されました。昨夜はほとんど、その問題の原因究明と解消に時間を費やしました…。

ところが…

最初に断っておくと、一夜明けて、仕事などで外出して帰宅し、PCを起動しなおしてUE4内でこの記事を書くためのスクショを取ろうとしていたら「あれ?」と気付いたのですが、どういうわけか「ボーンの軸ズレ問題」が消えてなくなっていましたw

ぼく自身、どうして解決したのかさっぱり分かりませんが…敢えて言うなら「なんらかの累積エラーがメモリ上に乗っかったまま騒いでいた」ということなのでしょう。

とはいえひとつの解決の糸口として

上記したように、確かな理由は分かりませんが、ワサビミドリさんのオサゲは、今では正常に「アニムダイナミクスって」います。

 しかし、それ以前の「無駄手間だったかも知れない試行錯誤」の中で、ひとつの方向性は見出すことができました。ですので万が一「Blenderでボーン付きアセットを作成して解消困難な問題が出てしまったとき限定の解決策」として、これを紹介することにします。

というのは…UE4内でもボーンの向きを変換するためのノードはあります。しかしこれは、ひとつひとつのボーンについてセットするものですので、いくつものチェーンになるボーンがおかしな向きになってしまった場合などでは、ほとんどお手上げです。

docs.unrealengine.com

それではBlenderからFBXとしてキャラクタを出力する段階ではどうでしょうか。

今まで推奨してきた(そして今後も推奨する)FBX6.1ASCIIフォーマットでは、ボーンの軸や向きを変更するためのプロパティはありません。

しかし!

f:id:kanianthi:20160614205423j:plain

↑FBX7.4バイナリ形式ならできるのです!

これができるのであれば、FBX7.4バイナリ形式をUE4への標準書き出しフォーマットにしたほうが「良いのかも」しれません。しかし、国内でも海外でも「FBX7.4だとアニメーションが正常に書き出されなかったり、一部(だけ)マテリアルがおかしくなるなどの問題が出る」という報告があるのも事実です。

またあるいは、Blenderのバージョンアップによって(本記事では2.77a)FBX書き出しアドオンの改善がされたのかも知れませんし、UE4側のFBX受け入れに変更があったのかも知れません…ですから、さらに多くの追試を行わないと、だったらFBX7.4でいいじゃん!と断言はできないのです。

結果的に、このようなボーン軸の変換を行っていないはずのFBX6.1ASCIIで書き出したワサビミドリのUE4アセットも…

f:id:kanianthi:20160614210521j:plain

↑画像のように、きちんと「標準フォーマットである」X軸ロールに変換されています…ん?本来はFBX6.1ASCIIで出力するだけで、勝手にボーンロール軸をXに直してくれるの?とか、色々考えましたが推論に過ぎません。しかも、昨夜は確かにロール軸がYのままでした…ぼくが寝ぼけていたか幻覚を見ていたかしたのでしょう…

というわけで、これまで「安定性」で実績のあるFBX6.1ASCIIで問題がないのであれば、よりステーラブルな方法を実践するべきだ、とぼくは思います。

しかしそれでも、(6.1に比較し)より改善されたフォーマットであるはずのFBX7.4を使いたいのでしたら、それはそれでメリットがあるの「かも」知れません。現にぼく自身が、PCを起動しなおしてもボーンのひっくり返り現象が継続していたなら、FBX7.4にワークフローを移行していたでしょう…。

結論的に結論はありません!なんだか良くわかんないけど直った!が結論です。

しかし、これらの現象および試行錯誤について、十分に理解のある知識と技術をお持ちの方には有用な情報になる、と判断しましたのでこの記事を公開します。

それでは次回は、AnimDynamicsを使った揺れモノの実装についてです。