【DXライブラリ】3Dモデルが正しく描写されないときにしたこと

【2018/4/5】3Dモデルが正しく描写されない問題についていくつかパターンがあるようなので記事の体裁変えて追記。

以前DXライブラリとC/C++で3Dゲームを作っていたのだが、3Dモデルが全く描写されずしばらくここで足踏みしてしまった。3Dモデルがきちんと描写されるようにしたことをメモしておく。他にも3Dモデルの一部だけが正しく描写されない問題もあるようなので併せて載せておく。

3Dモデルが全く描写されない

f:id:antique088b:20180310161457p:plain

Blenderで最初から表示されている立方体にこのようにちょいと色付けをしてをfbxで出力、DxLibModelViewerでmv1に変換。そしてDXライブラリ置き場のサンプルプログラムを参考に3Dモデルを描写してみたが、下の画像のように3Dモデルが描写されなかった(見えている線はDrawLine3Dでデバッグ用に引いたもので3Dモデルとは関係ない)。

f:id:antique088b:20180309195210p:plain

本来ならこうあってほしいのだが…

f:id:antique088b:20180309202657p:plain

DXライブラリでは3Dモデルの読み込みをMV1LoadModelを使って行い、MV1DrawModelで描写を行う。この2つの関数に不備があるとは思えない(あれば対策を調べた際にもっと情報が出てくるはず)ので99%こちら側のミスだろう。とりあえず超基本的なところから見直してみた。

3Dモデルを読み込む際に指定するパスが間違っている

まずMV1LoadModelで3Dモデルを読み込むのだがそのときに指定するパスが正しいかどうか最初に確認。ブログ主は3Dモデルのファイルはソースコードがある場所にフォルダを作り、まとめて置いている。そして相対パスで指定している。Visual Studio 2017を使っているなら

Visual Studio 2017 > Projects > (プロジェクト名) > (プロジェクト名)

f:id:antique088b:20190807095737p:plain

こんな感じ。そしてコードは

int ModelHandle;    //3Dモデルを格納する変数
/*中略*/
ModelHandle = MV1LoadModel("3Dmodel/***.mv1");

こんな感じで記述するのだが1文字間違えて読み込めなくなることが意外とある。あとは相対パスと絶対パスを混合したり。

MV1DrawModelに対応していないファイルを使用している

MV1DrawModelで扱える3Dモデルのファイルは以下の4つである。

x, mqo, mmd(vmd), mv1

これ以外のファイル形式は扱うことができない。fbxに関してはとある専用のファイルをDLすることで使えるようになるが大変面倒らしい。

xは一昔前の標準だったファイル形式。そのためか一部の情報を保存できないため今では使われない(今の標準はfbx)。

mqoはメタセコイアで作ったときのファイル形式。

mmd(vmd)はニコニコで有名なMMDのファイル形式。

mv1はDXライブラリ専用のファイル形式。DXライブラリをDLしたときに付属でついてくるDxLibModelViewerでこの形式で保存できる。ちなみにDxLibModelViewerで扱えるファイル形式はx, mqo, mmd(vmd), mv1, fbxの5つ。

DXライブラリと相性がいいとされているmmd(vmd)でもそのまま使うと一部挙動が変わるらしいので DxLibModelViewerでmv1に変換するのが無難

MV1DrawModelのあるところを通っていない

コード上のミス。コメントアウトしてるのをうっかり忘れたり。デバッグで1行ずつ追って確認しましょう。

3Dモデルの位置がカメラの視野外にある

座標の初期化忘れとかカメラの視野の設定ミスとか。次の原因と絡むところがあるので同時に確認したい。

3Dモデルが大きすぎるor小さすぎる

ブログ主がつまづいてた原因がこれ。Blenderでデフォルトで最初から置いてある立方体に色を付けて描写させたらあまりにもでかすぎてカメラが内側に入って映らなくなった(面の裏側からだと描写されない)。3Dモデルの大きさを調整する関数はMV1SetScaleがあるが、3Dモデル作成ソフト側で調整して再出力するのが無難。

ちなみにBlenderの場合、デフォルトで最初から置いてある立方体をメートル法でスケール0.01にすると直径がだいたい2ちょっとになる

3Dモデルの一部が正しく描写されない場合

法線ベクトルが逆を向いている

要は面が裏返ってるところがありますよ、ということ。カメラアングルを変えて映ったらこれ。3Dモデルの法線ベクトルを確認しましょう。ちなみにBlenderで作ったmmdファイルをMMD本体で読み込むと描写が変になるとかの問題も法線ベクトルが関係している場合があるらしい。

3Dモデル出力時のミス

各パーツごとにレイヤーで分けて編集してるときにやりがちなミス。一部のレイヤーを選択し忘れて出力しちゃうとか。出力時選択レイヤーを確認しましょう。

3Dモデルに透明度の情報がある

ガラスとか氷とか透明度があるものを描写するときは3Dモデルの描写に順番が生じる。透明度がない部分を先に描写したあと透明度がある部分をカメラから見て奥から順に描写する必要がある。DXライブラリには残念ながら透明度がある部分を奥から描写する関数(Zソート)はないので自分で関数を作りましょう。

コメント

タイトルとURLをコピーしました