モコモコフレンズの3Dモデルをレイトレーシングで鑑賞する

まとめ: http://d.hatena.ne.jp/mjt/20150422/p1 From: http://www.columbia-games.com/3ds/mocomoco/

キャラクターデータ提供:見習い魔女とモコモコフレンズ

気付いたらあと2体ということで、そろそろ終盤の一日一モコモコ。昨日までのレトロネタとはうってかわって、今日は物量にモノを言わせたレイトレーシング
今回はほぼblenderの使い方ですが。。

レンダラの準備

レンダラはakari2( https://github.com/githole/akari2 )を使うことに。構造はeduptとほぼ同一で、探索の高速化等の改良が加わったもの。というわけでedupt( https://github.com/githole/edupt )を先に読むことを勧める。
akari2はビルドのためのファイル等が付属してこないので、CMakeを使用して捏造する。

また、VSのコンパイラは、いわゆるBOMの無いUTF-8ソースを読ませると発狂するためBOMを追加している。イテレータのdereferenceはDebug版のランタイムでは怒られるので削除。

モデルのロード

アセットの準備にはBlenderを使う。
まず、デフォルトのアセット(scene2.obj)をロードしてみる。blenderの3Dカーソルで観察(N キーでプロパティを出すと3Dカーソルの項目が出る)。すると、blenderとモデルで90度回転していることが判る。objファイル内では、y軸の正方向が上になっているのに対し、blenderではz軸の正方向が上になっている。

  • scene2.objの該当部分
v -0.538317 67.000000 -21.386932
v 1.531083 67.000000 8.545867
v -0.039000 67.000000 -21.413082
v -0.039000 68.000000 -21.413082
v 1.531083 68.000000 8.545868 ← ★ もっとも高い部分で68
usemtl WallM
s off
f 1 2 3

このため、akari2のソースコード中のパラメタとblender上のパラメタは:

blender(x, y, z) = akari2(x, -z, y)

の対応になっていることに注意する。
これに、ダウンロードしてきたモコモコフレンズのモデルデータ(.fbx)を更にimportし、適当に配置する。

blender上でのカメラパラメタの設定

構図を考えるために、blender上でのカメラパラメタを調整する必要がある。
akari2内でのカメラパラメタはmain.cppで与えられている。個々のパラメタの意味についてはeduptの資料を参照のこと。

  • main.cpp
 Float3 camera_position(12, 1, 6); /* カメラの絶対座標 */
 Float3 camera_lookat(0, 3.7, 1);  /* カメラの注視点 */
 Float3 camera_direction = normalize(camera_lookat - camera_position);
 float distance_to_screen = 0.65f;

 Float3 camera_up = normalize(Float3(-0.2, 1.0, 0.0));

blender上では簡単なlookatコマンドは用意されていないので手計算するのが早い。カメラの回転パラメタ形式にクオータニオンを指定してからpython console上で:

campos = Vector([12, -6, 1])
lookat = Vector([0, -1, 3.7])
dir = lookat - campos
bpy.data.objects["Camera"].rotation_quaternion = dir.to_track_quat('-Z','Y')

とすることでカメラの向きを設定できる。先述の通り、座標の表現が90度回転していることに注意。
カメラの画角を適当に調整してblender上でレンダリングしてみると:

(ここでは、camera upを処理していないのでカメラの傾きが間違っている)

ポーズのbake(apply)と顔パーツの削除

ポーズが付いたままだと編集が面倒なので、ポーズの焼き込みを行う。これを行うには、メッシュ(三角形のアイコンで表現されている)を選択し、モディファイアをApplyする ...説明が難しいが、

ここでapplyを押すことでポーズの焼き込みが行える。
ついでに、顔パーツを削除しておく。顔パーツが付いたままでは、レンダリングの際に"顔パーツが貼られる筈だった表面"が浮いてしまう。モコモコフレンズのモデルは、顔パーツについてはテクスチャのαを活用しているため、透明部分が表現できないと微妙な見た目になってしまう。

.objのエクスポートとマテリアルの編集

akari2のシーンを作るために、blenderのexportから.objをエクスポートする。
このとき、Triangulate Facesをチェックする必要がある。

エクスポートした.objと同時に.mtlファイルも生成されるが、これはakari2から読めないので添付のシーンを参考に適当に捏造する必要がある。
また、エクスポートした.objに含まれる.mtlのパスも修正が必要。