DXライブラリとC言語でゲーム制作。今回は3Dゲーム作成なら絶対に必要な3Dモデルの表示方法について説明しています。
3Dモデル表示の基本
DXライブラリで3Dモデルを表示させる場合はおおまかに以下の流れになる。
- pmd(+vmd)、pmx(+vmd)、mv1ファイルのどれかを用意する
- MV1LoadModel()で3Dモデルをメモリに読み込む
- SetCameraNearFar()とSetCameraPositionAndTarget_UpVecY()でカメラの設定
- MV1DrawModel()で3Dモデル表示
- 終了処理の時にMV1DeleteModel()で3Dモデルをメモリから削除
DXライブラリで読み込める3Dモデルのファイル形式は以下の通り。
- x
- mqo
- pmd(+vmd)
- pmx(+vmd)
- mv1
xは昔のファイル形式で現在はまず使うことがない。mqoはメタセコイアで作成された3Dモデルのファイル形式。pmd・pmxはMMD。mv1はDXライブラリ専用のファイル形式でDXライブラリダウンロード時についてくる「DxLibModelViewer」から変換するとできるファイル形式。DxLibModelViewerでは上の5つのほかにfbxファイルが読み込める。
3DモデルはMMDを使うか、fbxファイルをDxLibModelViewerでmv1に変換するのが基本。
また3Dモデルを使う際はスケールに注意。フリー素材をあちこちから取ってきてる場合はスケールが違う可能性があるのでBlenderなどで統一する。複数人で開発する場合もあらかじめスケールを決めておくこと。
実装
ここからは実装。シーン管理実装の際に作ったGame.cpp/hに3Dモデル表示コードを書いていく。
今回使うモデルの見た目。VRoid Studioで作ったものをBlenderでスケールを「メートル法:0.01」にしてfbx化し、さらにmv1に変換したもの。

また3Dモデルはsinやvcxprojファイルがある場所に「3DModel」フォルダを作り、さらに「TEST」フォルダを作ってそこに置いている。
まずは3Dモデルの情報を扱うためにPlayer.cpp/hを追加する。
Player.h
#ifndef DEF_PLAYER_H #define DEF_PLAYER_H void Player_Initialize(); void Player_Update(); void Player_Draw(); void Player_Finalize(); #endif
Player.cpp
#include "DxLib.h" #include "Input.h" #include "Player.h" typedef struct { int ModelHandle; //モデルハンドル VECTOR Position; //座標 }player_t; player_t player; //初期化 void Player_Initialize() { //座標は原点 player.Position = VGet(0.0f, 0.0f, 0.0f); //モデルの読み込み player.ModelHandle = MV1LoadModel("3DModel/TEST/TEST.mv1"); } //更新 void Player_Update() { } //描写 void Player_Draw() { MV1DrawModel(player.ModelHandle); } //終了処理 void Player_Finalize() { MV1DeleteModel(player.ModelHandle); }
Playerの構造体を作り、座標とモデルハンドルの情報を持たせる。VECTORはDXライブラリが用意している3つの変数(x, y, z)を持つ構造体。MV1LoadModel()に読み込ませたい3Dモデルを相対パスで指定。
次にカメラの情報を扱うためにCamera.cpp/hを追加する。
Camera.h
#ifndef DEF_CAMERA_H #define DEF_CAMERA_H void Camera_Initialize(); void Camera_Update(); void Camera_Draw(); void Camera_Finalize(); #endif
Camera.cpp
#include "DxLib.h" #include "Input.h" #include "Camera.h" //カメラ初期化 void Camera_Initialize() { //奥行0.1~1000までをカメラの描画範囲とする SetCameraNearFar(0.1f, 1000.0f); //プレイヤーを見る角度にカメラを設置 SetCameraPositionAndTarget_UpVecY(VGet(0.0f, 1.2f, -3.8f), VGet(0.0f, 1.0f, 0.0f)); //ライティング処理をOFF SetUseLighting(FALSE); } //カメラ情報更新 void Camera_Update() { } //描画 void Camera_Draw() { } //カメラ終了処理 void Camera_Finalize() { }
SetCameraNearFar()でカメラの描画範囲を、SetCameraPositionAndTarget_UpVecY()でカメラの位置を注視点を指定する。
今回ではライティング処理をOFFにしている。ONだと現状下のように怖い見た目になってしまうのでOFFにしている。

最後にGame.cppに以下のコードを追加・変更する。
Game.cpp
#include "Player.h" #include "Camera.h" //初期化 void Game_Initialize() { //プレイヤー情報初期化 Player_Initialize(); //カメラ情報初期化 Camera_Initialize(); } //更新 void Game_Update() { //プレイヤー情報更新 Player_Update(); //カメラ情報更新 Camera_Update(); //中略 } //描画 void Game_Draw() { //中略 //プレイヤーの描画 Player_Draw(); Camera_Draw(); } //終了処理 void Game_Finalize() { Player_Finalize(); Camera_Finalize(); }
プレイヤーおよびカメラの初期化・更新・描画・終了処理を行う関数を追加。
実行した結果

コメント