DXライブラリで3Dモデルが正しく表示されないときの対処法について説明しています。
- 全く表示されない
- テクスチャが表示されていない
- 一部描画がおかしい
- 前後関係がおかしい
…とケースが色々あるので1つずつ見ていきます。
全く表示されない場合
3Dモデルが全く表示されない場合は概ね以下の場合になる。
- DXライブラリに対応していないファイルを使っている
- 3Dモデルのパスが間違っている
- カメラの視野内にない
DXライブラリに対応しているファイルか?
DXライブラリで扱える3Dモデルのファイルは x, mqo, mmd(vmd), mv1 の4つのみ。fbxやvroid/vrmは対応していないので注意。
mmd(vmd)以外は一度fbxファイルで出力し、DxLibModelViewerでmv1に変換するのが無難。
パスは合っているか?
3Dモデルを読み込むときにパスを指定するわけだがこれが間違っていると当然ながら読み込めない。
パスには絶対パスと相対パスがあるがどちらにせよパスの指定先に3Dモデルがあるかどうか確認する。誤字脱字をしていないかも確認すること。
カメラの視野内にあるか?
当然と言えば当然なのだが盲点になりがち。
カメラの座標や注視点、3Dモデルの座標を確認するほかカメラの描画範囲も確認しておきたい。カメラの描画範囲を変更するには SetCameraNearFar() を使う。
あと3Dモデルのスケールにも注意。スケールが大きいとカメラが3Dモデルの内側に入って描画されない場合がある。
テクスチャが反映されていない場合

上の画像のようにモデル全体が灰色になっている場合、3Dモデル内のテクスチャのパスが外れているのが原因。3Dモデルが完成したあと3Dモデルのファイルだけ移動させたりするとなりがち。
3Dモデルを元の場所に戻す、あるいはパスに合うようにテクスチャ画像を移動させれば直るがそれがわからない場合は一度3Dモデリングソフトでテクスチャのパスを再指定してmv1形式で出力し直すこと。
一部だけ表示がおかしい場合
一部だけ表示がおかしい場合は大体以下の通り。
- 一部の面だけ表示されていない
- 裏面が表示されていない
- 前後関係がおかしくなってる
面の向きが合っているか?
一部の面だけ表示されていない、という場合は面が裏返っている可能性がある。
一度3Dモデリングソフトを開いて該当する面の向きを反転し、mv1に再変換すればきちんと表示されるようになる。
バックカリングの設定はどうなっているか?
DXライブラリでは裏面の描画はデフォルトでしない、バックカリングがオンの設定になっているため、裏面は表示されない仕様になっている。
ソースコードからバックカリングの設定はできないのでDxLibModelViewerでバックカリング設定を見直しましょう。
前後関係を考えているか?
奥にあるオブジェクトが一番前に出ているように見えるといった場合はオブジェクトの前後関係がおかしくなっている可能性がある。
この場合は MV1SetUseZBuffer() と MV1SetWriteZBuffer() でZバッファをオンにして描画すると正しく描画されるはず。
下着が上着より前に出ている場合、つまり1つのモデル内で前後関係がおかしい場合は3Dモデル描画の際パーツ毎に1つずつ描画する。人体モデルなら体、顔、髪、下着、靴、上着…といった順に内側から外側に描画していく。
3Dモデリングソフトでモデル内のオブジェクトを体→顔→髪→下着→…の順になるようにリネームして並び替えてもよい。
半透明要素がある部分でおかしい場合
水やガラスなど半透明要素がある部分で表示がおかしい場合、上にも書いた前後関係が絡んでくる。
前後関係を扱うZバッファと半透明は相性が悪く、ここだけ違う描画処理をする必要がある。
まず半透明要素がない3Dモデルを全部描画し、そのあとに半透明要素がある3Dモデルをカメラから見て奥から順に描画していく。
Zソートを使う、ということになるが残念ながらDXライブラリにはZソート関数がないのでめんどうですが自分で作りましょう。

コメント