DXライブラリで、もっと線形代数する ~ Lumino.Math を DXライブラリ で使う
前回の記事で紹介した Lumino.Math を DXライブラリ用にパッケージ化しました。
DXライブラリでカメラの向いてる方に移動したいとか、
クォータニオンするとか、視錐台カリングするとか、IKするとか、
いろいろなことがやり易くなるかなと。
準備
ダウンロードした ZIP の中にある「プロジェクトに追加すべきファイル_VC用」
フォルダの内容を、お使いのDXライブラリの
「プロジェクトに追加すべきファイル_VC用」フォルダに上書きしてください。
使い方
ソースファイルには "LuminoMathDxLib.h" を include してください。
次のように、"DxLib.h" の後に include する必要があります。
#include <DxLib.h> #include <LuminoMathDxLib.h> using namespace Lumino; // 全てのクラスは Lumino 名前空間に入っています
DXライブラリでは VGet() にてベクトルを作りますが、
Lumino.Math ではコンストラクタを使用します。
VECTOR dxVec = VGet(100.0f, 200.0f, 400.0f); // DXライブラリ Vector3 vec(100.0f, 200.0f, 400.0f); // Lumino.Math
Vector3 クラスと Matrix クラスは、DXライブラリの VECTOR、MATRIX へ
直接代入できます。
Vector3 vec(1, 2, 3); VECTOR dxVec = vec;
直接 DXライブラリの関数に渡すこともできます。
Matrix mat = Matrix::RotationYawPitchRoll(0.0, 0.5, 1.0); MV1SetMatrix(model, mat);
DX ライブラリを使用した3Dモデルビューアのサンプル
マウスでぐりぐり動かせるモデルビューアです。
回転にはクォータニオンを使用しています。
#include <DxLib.h> #include <LuminoMathDxLib.h> using namespace Lumino; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE); if (DxLib_Init() == -1) return -1; SetCameraNearFar(1.0f, 150.0f); int model = MV1LoadModel(/*モデルファイル名*/); Quaternion modelRot; // モデルの回転姿勢 int lastMouseX = -1; // マウスドラッグ量を調べるための変数 (前回のクリック位置) int lastMouseY = -1; // マウスドラッグ量を調べるための変数 (前回のクリック位置) float cameraZ = -5.0f; // カメラの前後位置 // メインループ while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { //----------------------------------------------------- // マウス移動量から回転姿勢を更新 int mouseState = GetMouseInput(); if (mouseState & MOUSE_INPUT_LEFT) { int mouseX, mouseY; GetMousePoint(&mouseX, &mouseY); if (lastMouseX >= 0) { // 前回のマウスX座標との差分を角度として、現在の姿勢をY軸周りで回転する modelRot.RotateY(0.01f * (lastMouseX - mouseX)); } if (lastMouseY >= 0) { // 前回のマウスY座標との差分を角度として、現在の姿勢をX軸周りで回転する modelRot.RotateX(0.01f * (lastMouseY - mouseY)); } lastMouseX = mouseX; lastMouseY = mouseY; } else { // マウスドラッグ解除 lastMouseX = -1; lastMouseY = -1; } // カメラ位置はマウスホイールの移動量から適当に設定 cameraZ += GetMouseWheelRotVol(); //----------------------------------------------------- // 描画処理 ClearDrawScreen(); // カメラ位置の設定 SetCameraPositionAndTargetAndUpVec( VGet(0, 0, cameraZ), VGet(0, 0, 0), VGet(0, 1, 0)); // クォータニオン(回転姿勢)を行列に変換してモデルに設定、描画する Matrix modelMat = Matrix::RotationQuaternion(modelRot); MV1SetMatrix(model, modelMat); MV1DrawModel(model); // info DrawString(0, 0, "マウス左ドラッグでモデルを回転します。", GetColor(255, 255, 255)); DrawString(0, 16, "マウスホイールでカメラを前後に移動します。", GetColor(255, 255, 255)); ScreenFlip(); } DxLib_End(); return 0; }