DXライブラリ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
YTさん

DXライブラリ

#1

投稿記事 by YTさん » 9年前

DXライブラリについての質問です。
DXライブラリを使いmmdを動かしたいのですが、ハンドルモデルが表示されません。前まで表示されていたのですが、プログラミングを大きく書き直したところ、いつのまにかデバッグしてみたときには表示されなくなっていました。どこに原因があるのかわかりません。プログラミングを書くのが下手なので読みずらいと思いますが、どうしたら表示させることができるようになるか教えてください。自分が書いたプログラミングは以下のものです。

コード:

 
// ライブラリ関数 ///////////////////////////////////////////////////////////////////////

#include <DxLib.h>
#include <math.h>

// マクロ定義 ///////////////////////////////////////////////////////////////////////////

#define     CAMERA_NEAR    0.1f                                 //カメラ付近の描写範囲
#define     CAMERA_FAR     1000.0f                              //カメラからの描写範囲

// プロトタイプ宣言 ////////////////////////////////////////////////////////////////////

int ModelHandle;                                                 //モデル
int StageHandle;                                                 //ステージ
float angleY = 0.0f;                                             //Y軸アングル
static const float ROTATE_SPEED = DX_PI_F / 90;                  //回転スピード
float MoveVector = 0.3f;                                         //移動距離
float MHX = 0, MHY = 0, MHZ = 0;                                 //モデルポジション
VECTOR CAMERA_Pos = VGet(0, 20, 35);                             //カメラポジション
VECTOR CAMERA_Target = VGet(0, 10, 0);                           //カメラターゲット
MATRIX Matrix_Rot;                                               //回転行列
MATRIX Matrix_PS;                                                //平行行列
MATRIX Matrix_UR;                                                //拡大&縮小行列
MATRIX Matrix_Set;                                               //行列
float PlayTime_W = 0.0f;                                         //走りモーション再生時間
float PlayTime_S = 0.0f;                                         //立ちモーション再生時間

// 自作関数 ///////////////////////////////////////////////////////////////////////////

//輪郭修正
void material()
{
	float dotwidth;
	int i;

	int MaterialNum = MV1GetMaterialNum(ModelHandle);
	for (i = 0; i < MaterialNum; i++)
	{
		float dotwidth = MV1GetMaterialOutLineDotWidth(ModelHandle, i);
		MV1SetMaterialOutLineDotWidth(ModelHandle, i, dotwidth / 20.0f);
	}

}
//向き変換
void Vector(int i)
{
	if (i == 0)//前
	{
		MHX += MoveVector*sin(angleY);
		MHZ -= MoveVector*cos(angleY);
	}
	else if (i == 1)//左
	{
		MHX += MoveVector*cos(angleY);
		MHZ += MoveVector*sin(angleY);
	}
	else if (i == 2)//右
	{
		MHX -= MoveVector*cos(angleY);
		MHZ += MoveVector*sin(angleY);
	}
	else if (i == 3)//後ろ
	{
		MHX += MoveVector*sin(angleY);
		MHZ += MoveVector*cos(angleY);
	}
}
//立つモーション
void Mortion_Stand() {
	float TotalTime;//アタッチの総タイム
	float AttachIndex;//アタッチ番号

	AttachIndex = MV1AttachAnim(ModelHandle, 0, -1, FALSE);
	TotalTime = MV1GetAttachAnimTotalTime(ModelHandle, AttachIndex);

	PlayTime_S += 0.2f;

	if (PlayTime_S >= TotalTime)
		PlayTime_S = 0.0f;

	MV1SetAttachAnimTime(ModelHandle, AttachIndex, PlayTime_S);



}
//走るモーション
void Mortion_Walk(int i) {

	float TotalTime;//アタッチの総タイム
	float AttachIndex;//アタッチ番号

	AttachIndex = MV1AttachAnim(ModelHandle, 1, -1, FALSE);
	TotalTime = MV1GetAttachAnimTotalTime(ModelHandle, AttachIndex);


	PlayTime_W += 0.2f;

	if (PlayTime_W >= TotalTime)
		PlayTime_W = 0.0f;

	Vector(i);
	Matrix_PS = MGetTranslate(VGet(MHX, MHY, MHZ));

	SetCameraPositionAndTarget_UpVecY(VGet(MHX + CAMERA_Pos.x, MHY + CAMERA_Pos.y, MHZ + CAMERA_Pos.z),
 VGet(MHX + CAMERA_Target.x, MHY + CAMERA_Target.y, MHZ + CAMERA_Target.z));  //カメラポジション&ターゲット

	MV1SetAttachAnimTime(ModelHandle, AttachIndex, PlayTime_W);



}

// main関数 /////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	ChangeWindowMode(TRUE);
	if (DxLib_Init() == -1)
		return -1;

	SetDrawScreen(DX_SCREEN_BACK);

	MV1SetLoadModelUsePhysicsMode(DX_LOADMODEL_PHYSICS_REALTIME);                  //物理演算
	ModelHandle = MV1LoadModel("古明地こいし/古明地こいし.pmx");                   //モデルの読み込み
	StageHandle = MV1LoadModel("地霊殿/地霊殿屋内/地霊殿ロビー.pmx");              //ステージの読み込み
	ClearDrawScreen();
	MV1DrawModel(StageHandle);                                                     //ステージ描写
	SetCameraNearFar(CAMERA_NEAR, CAMERA_FAR);                                     //奥行の描写範囲
	SetCameraPositionAndTarget_UpVecY(VGet(0, 20, 35), VGet(0.0f, 10.0f, 0.0f));   //カメラポジションとターゲットアングル

        //キー入力
	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0)
	{

		if (CheckHitKey(KEY_INPUT_W) == 1)//前
		{
			Mortion_Walk(0);
			PlayTime_S = 0.0f;
		}
		else if (CheckHitKey(KEY_INPUT_A) == 1)//左
		{
			Mortion_Walk(1);
			PlayTime_S = 0.0f;
		}
		else if (CheckHitKey(KEY_INPUT_D) == 1)//右
		{
			Mortion_Walk(2);
			PlayTime_S = 0.0f;
		}
		else if (CheckHitKey(KEY_INPUT_S) == 1)//後ろ
		{
			Mortion_Walk(3);
			PlayTime_S = 0.0f;
		}
		else if (CheckHitKey(KEY_INPUT_LEFT) == 1)//左
		{
			angleY -= ROTATE_SPEED;
			Matrix_Rot = MGetRotY(angleY);
			PlayTime_W = 0.0f;
			PlayTime_S = 0.0f;
		}
		else if (CheckHitKey(KEY_INPUT_RIGHT) == 1) //右
		{
			angleY += ROTATE_SPEED;
			Matrix_Rot = MGetRotY(angleY);
			PlayTime_W = 0.0f;
			PlayTime_S = 0.0f;
		}
		else if (CheckHitKey(KEY_INPUT_U) == 1)//拡大
		{
			Matrix_UR = MGetScale(VGet(2.0f, 2.0f, 2.0f));
			PlayTime_W = 0.0f;
			PlayTime_S = 0.0f;
		}
		else if (CheckHitKey(KEY_INPUT_R) == 1)//縮小
		{
			Matrix_UR = MGetScale(VGet(0.5f, 0.5f, 0.5f));
			PlayTime_W = 0.0f;
			PlayTime_S = 0.0f;
		}
		else
		{
			Mortion_Stand();
		}

		Matrix_Set = MMult(Matrix_UR, Matrix_Rot);
		Matrix_Set = MMult(Matrix_Set, Matrix_PS);
		MV1SetMatrix(ModelHandle, Matrix_Set);
		MV1DrawModel(ModelHandle);
		MV1DrawModel(StageHandle);
		material();
	}

	DxLib_End();

	return 0;
}
 

hide

Re: DXライブラリ

#2

投稿記事 by hide » 9年前

前まで表示できていたときのソースはないのですか?
1からソースコードを読み直して確認するのは面倒すぎるので、差分を見て判断するのが一番早いです。

YTさん

Re: DXライブラリ

#3

投稿記事 by YTさん » 9年前

返信ありがとうございます
前のがまだ残っていたので、見比べて何処に原因があるのか探して見ようと思います。

YTさん

Re: DXライブラリ

#4

投稿記事 by YTさん » 9年前

Matrix_SetにMV1GetMatrix(ModelHandle)を代入し、以下のプログラムに書き換えた結果表示されるようになったのですが、移動や回転するとき
押せば押すほどスピードがはやくなってしまうのですが、どうしたらよいでしょうか?また、押せば押すほどモーションのせいでか、ハンドモデルの体の一部が変な方向を向いたりするのですが、この場合フレーム関数を使う必要があるのでしょうか?

コード:

// ライブラリ関数 ///////////////////////////////////////////////////////////////////////

#include <DxLib.h>
#include <math.h>

// マクロ定義 ///////////////////////////////////////////////////////////////////////////

#define     CAMERA_NEAR    0.1f                                 //カメラ付近の描写範囲
#define     CAMERA_FAR     1000.0f                              //カメラからの描写範囲

// プロトタイプ宣言 ////////////////////////////////////////////////////////////////////

int ModelHandle;                                                 //モデル
int StageHandle;                                                 //ステージ
float angleY = 0.0f;                                             //Y軸アングル
static const float ROTATE_SPEED = DX_PI_F / 90;                  //回転スピード
float MoveVector = 0.3f;                                         //移動距離
float MHX = 0, MHY = 0, MHZ = 0;                                 //モデルポジション
VECTOR CAMERA_Pos = VGet(0, 20, 35);                             //カメラポジション
VECTOR CAMERA_Target = VGet(0, 10, 0);                           //カメラターゲット
MATRIX Matrix_Rot;                                               //回転行列
MATRIX Matrix_PS;                                                //平行行列
MATRIX Matrix_UR;                                                //拡大&縮小行列
MATRIX Matrix_Set;                                               //行列

// 自作関数 ///////////////////////////////////////////////////////////////////////////

//輪郭修正
void material()
{
	float dotwidth;
	int i;

	int MaterialNum = MV1GetMaterialNum(ModelHandle);
	for (i = 0; i < MaterialNum; i++)
	{
		float dotwidth = MV1GetMaterialOutLineDotWidth(ModelHandle, i);
		MV1SetMaterialOutLineDotWidth(ModelHandle, i, dotwidth / 20.0f);
	}

}

int KeyW(int i)
{
	if (i == 0)
		return (CheckHitKey(KEY_INPUT_W));
	else if (i == 1)
		return (CheckHitKey(KEY_INPUT_A));
	else if (i == 2)
		return (CheckHitKey(KEY_INPUT_D));
	else if (i == 3)
		return (CheckHitKey(KEY_INPUT_S));

}
//向き変換
void Vector(int i)
{
	if (i == 0)//前
	{
		MHX -= MoveVector*sin(angleY);
		MHZ -= MoveVector*cos(angleY);
	}
	else if (i == 1)//左
	{
		MHX += MoveVector*cos(angleY);
		MHZ -= MoveVector*sin(angleY);
	}
	else if (i == 2)//右
	{
		MHX -= MoveVector*cos(angleY);
		MHZ += MoveVector*sin(angleY);
	}
	else if (i == 3)//後ろ
	{
		MHX += MoveVector*sin(angleY);
		MHZ += MoveVector*cos(angleY);
	}
}
//立つモーション
void Mortion_Stand() {
	float TotalTime;//アタッチの総タイム
	float AttachIndex;//アタッチ番号
	float PlayTime;                      //アタッチのリアルタイム

	AttachIndex = MV1AttachAnim(ModelHandle, 0, -1, FALSE);
	TotalTime = MV1GetAttachAnimTotalTime(ModelHandle, AttachIndex);
	PlayTime = 0.0f;
	while (ProcessMessage() == 0 && ClearDrawScreen() == 0)
	{
		//キーが押されたときループ脱出
		if (CheckHitKey(KEY_INPUT_W) == 1 ||
			CheckHitKey(KEY_INPUT_A) == 1 ||
			CheckHitKey(KEY_INPUT_D) == 1 ||
			CheckHitKey(KEY_INPUT_S) == 1 ||
			CheckHitKey(KEY_INPUT_LEFT) == 1 ||
			CheckHitKey(KEY_INPUT_RIGHT) == 1 ||
			CheckHitKey(KEY_INPUT_SPACE) == 1 &&
			ClearDrawScreen() == 0)
			break;
		PlayTime += 0.2f;

		if (PlayTime >= TotalTime)
			PlayTime = 0.0f;

		MV1SetAttachAnimTime(ModelHandle, AttachIndex, PlayTime);
		
		MV1SetMatrix(ModelHandle, Matrix_Set);
		MV1DrawModel(ModelHandle);
		MV1DrawModel(StageHandle);
		material();
		ScreenFlip();
	}


}
//走るモーション
void Mortion_Walk(int i) {

	float TotalTime;                     //アタッチの総タイム
	float PlayTime;                      //アタッチのリアルタイム
	float AttachIndex;                   //アタッチ番号

	AttachIndex = MV1AttachAnim(ModelHandle, 1, -1, FALSE);
	TotalTime = MV1GetAttachAnimTotalTime(ModelHandle, AttachIndex);
	PlayTime = 0.0f;

	while (ProcessMessage() == 0 && ClearDrawScreen() == 0)
	{
		if (KeyW(i) == 0 && ClearDrawScreen() == 0) {

			break;
		}

		PlayTime += 0.2f;

		if (PlayTime >= TotalTime)
			PlayTime = 0.0f;


	Vector(i);
	Matrix_PS = MGetTranslate(VGet(MHX, MHY, MHZ));
	Matrix_Set = MMult(Matrix_Set, Matrix_PS);
	MV1SetMatrix(ModelHandle, Matrix_Set);
	SetCameraPositionAndTarget_UpVecY(VGet(MHX + CAMERA_Pos.x, MHY + CAMERA_Pos.y, MHZ + CAMERA_Pos.z), VGet(MHX + CAMERA_Target.x, MHY + CAMERA_Target.y, MHZ + CAMERA_Target.z));  //カメラポジション&ターゲット

	MV1SetAttachAnimTime(ModelHandle, AttachIndex, PlayTime);
	MV1DrawModel(ModelHandle);
	MV1DrawModel(StageHandle);
	material();
	ScreenFlip();

	}


}

// main関数 /////////////////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	ChangeWindowMode(TRUE);
	if (DxLib_Init() == -1)
		return -1;

	SetDrawScreen(DX_SCREEN_BACK);

	MV1SetLoadModelUsePhysicsMode(DX_LOADMODEL_PHYSICS_REALTIME);                  //物理演算
	ModelHandle = MV1LoadModel("古明地こいし/古明地こいし.pmx");                   //モデルの読み込み
	StageHandle = MV1LoadModel("地霊殿/地霊殿屋内/地霊殿ロビー.pmx");              //ステージの読み込み
	ClearDrawScreen();
	MV1DrawModel(StageHandle);                                                     //ステージ描写
	SetCameraNearFar(CAMERA_NEAR, CAMERA_FAR);                                     //奥行の描写範囲
	SetCameraPositionAndTarget_UpVecY(VGet(0, 20, 35), VGet(0.0f, 10.0f, 0.0f));   //カメラポジションとターゲットアングル
	Matrix_Set = MV1GetMatrix(ModelHandle);

																				   //キー入力
	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0)
	{

		if (CheckHitKey(KEY_INPUT_W) == 1)//前
		{
			Mortion_Walk(0);
		}
		else if (CheckHitKey(KEY_INPUT_A) == 1)//左
		{
			Mortion_Walk(1);
		}
		else if (CheckHitKey(KEY_INPUT_D) == 1)//右
		{
			Mortion_Walk(2);
		}
		else if (CheckHitKey(KEY_INPUT_S) == 1)//後ろ
		{
			Mortion_Walk(3);
		}
		else if (CheckHitKey(KEY_INPUT_LEFT) == 1)//左
		{
			angleY -= ROTATE_SPEED;
			Matrix_Rot = MGetRotY(angleY);
			Matrix_Set = MMult(Matrix_Set, Matrix_Rot);

		}
		else if (CheckHitKey(KEY_INPUT_RIGHT) == 1) //右
		{
			angleY += ROTATE_SPEED;
			Matrix_Rot = MGetRotY(angleY);
			Matrix_Set = MMult(Matrix_Set, Matrix_Rot);
		}
		else if (CheckHitKey(KEY_INPUT_U) == 1)//拡大
		{
			Matrix_UR = MGetScale(VGet(2.0f, 2.0f, 2.0f));
			Matrix_Set = MMult(Matrix_Set, Matrix_UR);

		}
		else if (CheckHitKey(KEY_INPUT_R) == 1)//縮小
		{
			Matrix_UR = MGetScale(VGet(0.5f, 0.5f, 0.5f));
			Matrix_Set = MMult(Matrix_Set, Matrix_UR);
		}
		else
		{
			Mortion_Stand();
		}

		MV1SetMatrix(ModelHandle, Matrix_Set);
		MV1DrawModel(ModelHandle);
		MV1DrawModel(StageHandle);
		material();
	}

	DxLib_End();

	return 0;
}

YTさん

Re: DXライブラリ

#5

投稿記事 by YTさん » 9年前

このようにした結果自己解決しました。どうやら、バグでモデルの操作がおかしくなってたみたいでした。お騒がせしました。

コード:

//* ライブラリ関数 *///////////////////////////////////////////////////////////////////////

#include "DxLib.h"
#include <math.h>

//* マクロ定義 *///////////////////////////////////////////////////////////////////////////

#define     CAMERA_NEAR    0.1f                                  //カメラ付近の描写範囲
#define     CAMERA_FAR     1000.0f                               //カメラからの描写範囲
#define     AI_NUMBER      2                                     //アタッチ数


//* グローバル変数宣言 *//////////////////////////////////////////////////////////////////////////////

int ModelHandle;                                                 //モデル
int StageHandle;                                                 //ステージ
int MoveFlag;                                                    //動作フラグ
int RunFlag;                                                     //走るフラグ
static const float ROTATE_SPEED = DX_PI_F / 90;                  //回転スピード
float angleY = 0.0f;                                             //Y軸アングル
float MoveVector = 0.3f;                                         //移動距離
float MHX = 0, MHY = 0, MHZ = 0;                                 //モデルポジション
float PlayTime[AI_NUMBER];                                       //アタッチのリアルタイム
float TotalTime[AI_NUMBER];                                      //アタッチの総タイム   ※(0..立ち,1..走る)
float AttachIndex[AI_NUMBER];                                    //アタッチ番号         ※(0..立ち,1..走る)
VECTOR CAMERA_Pos = VGet(0, 20, 35);                             //カメラポジション
VECTOR CAMERA_Target = VGet(0, 10, 0);                           //カメラターゲット

//* プロトタイプ宣言 *////////////////////////////////////////////////////////////////////

void material();                                                 //輪郭修正

//* main */////////////////////////////////////////////////////////////////////////////////

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	ChangeWindowMode(TRUE);
	if (DxLib_Init() == -1)
		return -1;

	SetDrawScreen(DX_SCREEN_BACK);
    ClearDrawScreen();
	MV1SetLoadModelUsePhysicsMode(DX_LOADMODEL_PHYSICS_REALTIME);         //リアルタイムで物理演算
	ModelHandle = MV1LoadModel("古明地こいし/古明地こいし.pmx");          //モデルの読み込み
	StageHandle = MV1LoadModel("地霊殿/地霊殿屋内/地霊殿ロビー.pmx");     //ステージの読み込み
	MV1DrawModel(StageHandle);                                            //ステージ描写
	SetCameraNearFar(CAMERA_NEAR, CAMERA_FAR);                            //奥行の描写範囲
	SetCameraPositionAndTarget_UpVecY(CAMERA_Pos, CAMERA_Target);         //カメラ位置と視点
	MV1SetPosition(ModelHandle, VGet(MHX, MHY, MHZ));                     //カメラ初期位置


	//モーションアタッチ
	for (int i=0;i<AI_NUMBER;i++)
	{
		AttachIndex[i] = MV1AttachAnim(ModelHandle, i, -1, FALSE);
		TotalTime[i] = MV1GetAttachAnimTotalTime(ModelHandle, AttachIndex[i]);
		PlayTime[AI_NUMBER] = 0.0f;
	}


	//キー入力
	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0)
	{
		MoveFlag = 0;
		RunFlag = 0;

		if (CheckHitKey(KEY_INPUT_W) == 1)//前進
		{
			MoveFlag = 1;
			RunFlag = 1;
			MHX -= MoveVector*sin(angleY);
			MHZ -= MoveVector*cos(angleY);
		}
		else if (CheckHitKey(KEY_INPUT_A) == 1)//左
		{
			MoveFlag = 1;
			RunFlag = 1;
			MHX += MoveVector*cos(angleY);
			MHZ -= MoveVector*sin(angleY);
		}
		else if (CheckHitKey(KEY_INPUT_D) == 1)//右
		{
			MoveFlag = 1;
			RunFlag = 1;
			MHX -= MoveVector*cos(angleY);
			MHZ += MoveVector*sin(angleY);
		}
		else if (CheckHitKey(KEY_INPUT_S) == 1)//後ろ
		{
			MoveFlag = 1;
			RunFlag = 1;
			MHX += MoveVector*sin(angleY);
			MHZ += MoveVector*cos(angleY);
		}
		else if (CheckHitKey(KEY_INPUT_LEFT) == 1)//左へ回転
		{
			MoveFlag = 1;
			angleY -= ROTATE_SPEED;
		}
		else if (CheckHitKey(KEY_INPUT_RIGHT) == 1)//右へ回転
		{
			MoveFlag = 1;
			angleY += ROTATE_SPEED;
		}
		if (MoveFlag==1)
		{
			if (RunFlag == 1)
			{
					PlayTime[1] += 0.2f;

					if (PlayTime[1] >= TotalTime[1])
						PlayTime[1] = 0.0f;

					MV1SetPosition(ModelHandle, VGet(MHX, MHY, MHZ));
					SetCameraPositionAndTarget_UpVecY(VGet(MHX + CAMERA_Pos.x, MHY + CAMERA_Pos.y, MHZ + CAMERA_Pos.z),VGet(MHX + CAMERA_Target.x, MHY + CAMERA_Target.y, MHZ + CAMERA_Target.z));  //カメラポジション&ターゲット
					MV1SetAttachAnimTime(ModelHandle, AttachIndex[1], PlayTime[1]);

			}
		}
		else
		{
				PlayTime[0] += 0.2f;

				if (PlayTime >= TotalTime)
					PlayTime[0] = 0.0f;
				MV1SetAttachAnimTime(ModelHandle, AttachIndex[0], PlayTime[0]);
				MV1DrawModel(ModelHandle);
				MV1DrawModel(StageHandle);

		}

		MV1SetRotationXYZ(ModelHandle, VGet(0.0f, angleY, 0.0f));
		MV1DrawModel(ModelHandle);
		MV1DrawModel(StageHandle);
		material();
	}

	DxLib_End();

	return 0;
}
//* 外部 */////////////////////////////////////////////////////////////////////////////

//輪郭修正
void material()
{
	float dotwidth;
	int i;

	int MaterialNum = MV1GetMaterialNum(ModelHandle);
	for (i = 0; i < MaterialNum; i++)
	{
		float dotwidth = MV1GetMaterialOutLineDotWidth(ModelHandle, i);
		MV1SetMaterialOutLineDotWidth(ModelHandle, i, dotwidth / 20.0f);
	}

}

閉鎖

“C言語何でも質問掲示板” へ戻る