ての字のブロマガ

ダークソウルと FBX と Unity と私

2017/08/25 16:35 投稿

  • タグ:
  • Unity
  • Java

 なんだかんだでやれちゃった。

■手始めにマップモデル

ソラールさんの初期位置や太陽祭壇を再現しようとして断念したんだけど
もう少し早くとりかかればできたなあ

 ・マップオブジェクトとして保存されている flver データを、
  自作コンバータで obj 形式に変換。
 ・テクスチャの入っている tpfファイルを自作エクストラクタで png に変換。
 ・マテリアル設定をできるだけ再現し貼り付け。
 ・MeshCollider を使って当たり判定を作成。

 というやり方で、ウーラシールのゴーさんの作業場を Unity の世界に再現。下のアルトリウスエリアと闘技場マッチ部屋も、一応作ってある。
 ただし梯子が無い。例えあっても昇り降りのモーションもない。落ちたらおしまいだ。
 財宝未満で作ったプログラム・アセットから梯子関連の諸々を持ってきてもいいが、逆にあっちにこのシステムを入れ込んでしまった方が早いかもしれない。あっちでも弓撃てるようにしたいし。か、まあ、×ボタンで浮遊する、でもいいけどね。

 マップの読み込みは DSMODT もやって見せてくれるが、どのファイルがどのマップのどの部分なのかがよく分からない。なので、適当に flver ファイルを選んでコンバートして、中身を確認、という作業でなんとか探し当てた。「これはデーモン遺跡の背景!」「絵画世界の中間の霧のとこ!」と当てるのが楽しかった。
 一見してよく分からないものも幾つかあった。センの古城の天井部分とか、サイトーさんの動画でしか見たことないようなところは、流石に分からない。その過程で、小ロンドの背景とか、月光蝶のいる城とか、普段はいけないところの裏側が見れた。そのうち探索してみようと思う。

どこでしょう。難易度:初級
(ちなみに、当初は後述するように左右反転して読み込んでいた上、
気付いてなかったので、この手の非対称の奴は激ムズでした)

■ボーン読み込み、スキンメッシュ貼り付け

 これ以上のことをやるのは obj ではもう限界なので、FBX ASCII形式を模索。
 
 ・Skeleton.hkx を、hkxcmd の力を借りて xml 形式に変換してもらう。
 ・自作のコンバータで xml から FBX ボーンモデルを構築。
 ・キャラクタメッシュの入っている flver とつなぎ合せ、
  ボーン・スキンからなる FBX キャラクタファイルを生成可能にした。

 これで、自由なポーズを取らせることができるようになった。

 めっちゃ大変だった。その一番の原因は、俺が行列の計算がすこぶる苦手だということ。特に、transration の行列の書き方をあっさり間違っていた、というだけのことで、余計な時間を費やしてしまった。まあ、いいや。また勉強になったね。

 マップともどもこんな感じで片っ端から変換できるようになったが、問題は、その都度マテリアル設定を行なわなければならないことだ。
 FBXで書けるのは単一色とか光沢とか、そのあたりのこと。対応する tpf を探し出して png を自動生成、というのもできなくはないが、そうやって用意した テクスチャなどを FBX から外部参照するやり方、というのは、あるはずだが調べ切れていない。今のところ、Unity に持ってきたあと逐一自分で作らなければならない。
 しかし、一回作ってしまえば、キャラクタファイルを作り直して置き換えても、作成済みのマテリアルを壊さず、使いまわしてくれるので楽。
 いっそ、Unity の mat ファイルを並行して生成してしまえばいいだろうか。何かスマートじゃないけど、しょうがない。

アニメーション読み込み

 ・アニメーションの入った hkx を hkxcmd で kf に変換してもらう。
 ・上記の hkx(XML)+flverと組み合わせて、自作コンバータに食わせることで、
  アニメーション設定を同梱した FBX を生成することができる

ふつくしい

 Unity のアニメーションコントローラは複数モーションのブレンドも手軽にやってくれるので、例えば上記のグウィネヴィアであれば、肩やお乳の揺れを再現しつつ、もっと下を向かせたり左右に振らせたりすることもできる。頬杖つかせたりもできる。

ボーンをいじると目も開く

 ついでにヘッドトラッキングができないものかと思ったが、ちょっとスマートなやり方が思い浮かばない。スクリプトからアニメーションクリップに直接働きかけて、キーの値を変えてやればいいのだろうか?

■FBXを手中に収めるにはまだ分からないことだらけ

 ところで、ダークソウルのデータはそのまま Unity に持ってくると左右(または前後)が反転してしまう。右手だっけ左手だっけ、それとも OpenGL系って言っておいたほうがいいのかな? 今の Unity の環境とは違う。
 FBX には数値を元ソースのまま書き込んでおいて、"GlobalSetting" で座標系の設定ができるはずなのだが、どこをどういじっても、Unity にもってきたときには上下に引っくり返ったり左右反転した挙句後ろを向いたりして、単純に左右反転はしてくれない。ファイル変換時には座標値だけじゃなく回転行列のデータも扱わなければならないので、単に x にマイナス1 をかければいいというわけでもない。(と、思う。行列苦手だからそれすらよく分かってない)
 めんどくちゃいので、Unity 側に EmptyObject を作って xスケールを -1 にし、ダークソウルがらみのものは全てそこにを押し込むことにした。これまたスマートじゃないけど、シンプルなやりかただからまあいいかな。



 ゴーさんの方は、手始めにしょりしょりモーションを読み込んだぞ。その一方、弓を射るモーションがまだ見つからない・・・どっかに圧縮されてるのかな。

コメント

コメントはまだありません
コメントを書き込むにはログインしてください。

いまブロマガで人気の記事