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();
}プレイヤーおよびカメラの初期化・更新・描画・終了処理を行う関数を追加。
実行した結果

このままモデルを真正面から見てるだけでは味気ないので次はカメラを操作(回転)できるようにする。

コメント