広告あり

【DXライブラリ】3Dモデルを表示させる

DXライブラリとC言語でゲーム制作。今回は3Dゲーム作成なら絶対に必要な3Dモデルの表示方法について説明しています。

3Dモデル表示の基本

DXライブラリで3Dモデルを表示させる場合はおおまかに以下の流れになる。

  1. pmd(+vmd)、pmx(+vmd)、mv1ファイルのどれかを用意する
  2. MV1LoadModel()で3Dモデルをメモリに読み込む
  3. SetCameraNearFar()とSetCameraPositionAndTarget_UpVecY()でカメラの設定
  4. MV1DrawModel()で3Dモデル表示
  5. 終了処理の時に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();
}

プレイヤーおよびカメラの初期化・更新・描画・終了処理を行う関数を追加。

実行した結果

コメント

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