【DXライブラリ】3Dモデルが正しく表示されない時の対処法

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

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

 

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

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

 

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

 

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

 

全く描写されない場合

3Dモデルを読み込む際に指定するパスを確認する

まずMV1LoadModelで3Dモデルを読み込むのだがそのときに指定するパスが正しいかどうか最初に確認。Visual Studioを使っているならcppやhファイルがあるフォルダに3Dモデルを入れるフォルダを作り、そこに3Dモデルを入れる。

 

こんな感じ。そしてコードで3Dモデルを相対パスで指定する。

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モデルがカメラの視野外にあったり、3Dモデルが大きすぎてカメラが内側に入ったりすると3Dモデルが正しく表示されない(※モデルの裏面は描写されない)。

モデルの大きさを調整する場合、専用の関数MV1SetScaleがあるが3Dモデルの制作ソフト側で調整するのが無難。

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

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

自己発光の値を上げる

影になるところの面が真っ黒になる場合はモデルのマテリアルの「自己発光」の値を上げてみると本来着いていた色が出るようになる。DxLibModelViewerで調整するのが一番簡単。

 

法線ベクトルの向きを修正する

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

 

3Dモデル出力時にミスがないか確認

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

 

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

ガラスとか氷とか透明度があるものを描写するときは3Dモデルの描写に順番が生じる。透明度がない部分を先に描写したあと透明度がある部分をカメラから見て奥から順に描写する必要がある。

DXライブラリには残念ながら透明度がある部分を奥から描写する関数(Zソート)はないので自分で関数を作りましょう。

コメント

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