モーション再生について

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

モーション再生について

#1

投稿記事 by north » 10年前

お世話になっております。
前回は自己解決したのにもかかわらず、原因等を記載せずに終わってしまい申し訳ありませんでした。
今回質問したいのはモーション再生についてです。
下記のサイトを参考にDXライブラリを使用してモーション再生のプログラムを自分なりに組んでみたのですが、モーションが再生されず
どこが原因なのかわからず困っております。

参考にしたサイト
http://i-libro.net/wpmu/blog/archives/876

下記がコードとなります

Motion.h

コード:

#ifndef MOTIONH
#define MOTIONH

#include <stdio.h>
#include <string.h>
#include <iostream>
#include "DxLib.h"
using namespace std;

class CMotion
{
public:
	typedef struct
	{
		float AnimTime;
		int TotalTime;
		int Time; //時間
		int AnimSpd;
		int AnimeTime; //現在のアニメーションの再生開始時間
		int NowAnimNum; //現在のアニメーション番号
		int NowAttachNum; //現在のアタッチ番号
		int AnimeState;
		int oldNumber;    //古いアニメーション番号  
		int oldAtt;  //古いアタッチ番号  
		int oldStartTime;
		int StartTime;  //現在のアニメーションの再生開始時刻  
		int ANIMBLENDTIME;  //ブレンドする時間(ミリ秒)
	}MOTION_STATE;
private:
	MOTION_STATE tMotionState;
	int model; //モデルハンドル
	bool PauseFlag;
	enum AnimeState{RUN};
	VECTOR FirstPos; //モデルの初期位置
public:
	CMotion();
	virtual ~CMotion();
	void DrawModel(int ModelNum);
	void Anime();
	void InitAnime(int number, int srcmodel, int firstanime);
	void EraseAnimInfo(int number);
	void StepAnimTimeSub(int anim, int attach, int start);
	void StepAnimTime(int animindex);
	void SetPos(float x, float y, float z);
	void SetAnimeInfo(CMotion::MOTION_STATE AnimeInfo);
	MOTION_STATE GetMotionState();
};
#endif
Motion.cpp

コード:

#include"DxLib.h"
#include"Motion.h"
#include "Camera.h"
#include <Math.h>

#define PI 3.141592654



CMotion::CMotion()
{
	tMotionState.Time = 0;
	PauseFlag = false;
	tMotionState.AnimeState = RUN;
	tMotionState.TotalTime = 0;
	tMotionState.NowAttachNum = MV1AttachAnim(model, RUN);
	tMotionState.NowAnimNum = 0;
	tMotionState.ANIMBLENDTIME = 30;
	tMotionState.AnimSpd = 685;
}

CMotion::~CMotion()
{}
//-----------------------------------------------------------------------------
//メインのアニメーションの時間を設定
void CMotion::StepAnimTimeSub(int anim, int attach, int start)
{
	int totaltime = (int)(MV1GetAttachAnimTotalTime(anim, attach) * 1000.0f);
	tMotionState.TotalTime = totaltime;
	//アニメーション時間を算出して設定(MMDでは1フレーム=1/30秒なので補正が必要
	float animtime = 0.0f;
	if(totaltime == 0) animtime = 0.0f;  
	else 
	{  
		int progressTime = tMotionState.Time - start;
		animtime = (float)(progressTime * tMotionState.AnimSpd % totaltime) / 1000.0f;  
	}  
	MV1SetAttachAnimTime(anim, attach, animtime);
	//clsDx();printfDx("%6.3f\n", animtime);//時間チェック  
	//printfDx("%d\n", Att);//アタッチ番号チェック*/
	//printfDx("%d\n", Time);
}
//-----------------------------------------------------------------------------
//アニメーション進行
void CMotion::StepAnimTime(int animindex)
{
	if(tMotionState.NowAnimNum != animindex)
	{  
        //古い物をデタッチ  
        if(tMotionState.oldAtt != -1)
		{  
            MV1DetachAnim(model, tMotionState.oldAtt);  
            tMotionState.oldAtt = -1;  
        }  
        //古い情報を待避  
        tMotionState.oldNumber = tMotionState.NowAnimNum;  
        tMotionState.oldAtt = tMotionState.NowAttachNum;  
		tMotionState.oldStartTime = tMotionState.StartTime;
        //新しいアニメーションをアタッチ  
        tMotionState.NowAnimNum = animindex;  
        tMotionState.NowAttachNum = MV1AttachAnim(model, tMotionState.NowAnimNum);  
        //再生開始時間を記憶  
        tMotionState.StartTime = tMotionState.Time; 
    }

	StepAnimTimeSub(model, tMotionState.NowAttachNum, tMotionState.StartTime);

	//ブレンドが必要かどうか
	int time = tMotionState.Time - tMotionState.StartTime;
	if(time < tMotionState.ANIMBLENDTIME && tMotionState.oldAtt != -1)
	{
		float brate = (float)time / (float)tMotionState.ANIMBLENDTIME;
		MV1SetAttachAnimBlendRate(model, tMotionState.NowAttachNum, brate);
		//古いアニメーションのブレンドと時間設定
		MV1SetAttachAnimBlendRate(model, tMotionState.oldAtt, 1.0f-brate);
		StepAnimTimeSub(model, tMotionState.oldAtt, tMotionState.oldStartTime);
	}
	else 
	{
		//ブレンドレートを1にする
		MV1SetAttachAnimBlendRate(model, tMotionState.NowAttachNum, 1.0f);
		//古いものをデタッチ
		if(tMotionState.oldAtt != -1)
		{
			MV1DetachAnim(model, tMotionState.oldAtt);
			tMotionState.oldAtt = -1;
		}
	}
}
//-----------------------------------------------------------------------------
void CMotion::DrawModel(int ModelNum)
{
	if(PauseFlag == false)
	{
		tMotionState.Time++;
	}
	float r = (float)(tMotionState.Time % 10000) / (10000.0f / 360.0f) * PI / 180.0f;

	MATRIX m1 = MGetRotY(r);
	MATRIX m2 = MGetTranslate(FirstPos);
	MATRIX m4 = MGetTranslate(VGet(40, 0, 0));
	MATRIX m3 = MMult(m4, m1); //行列を掛け合わせる
	MATRIX m5 = MMult(m3, m2);

	//アニメーション設定  
    StepAnimTime(tMotionState.AnimeState);

	//MV1SetPosition(model, FirstPos);
	MV1DrawModel(model);
}
//-----------------------------------------------------------------------------
//モデルを複製し、初期状態のアニメーションを設定
void CMotion::InitAnime(int number, int srcmodel, int firstanime)
{
	model = MV1DuplicateModel(srcmodel);
	tMotionState.NowAttachNum = MV1AttachAnim(model, firstanime);
	tMotionState.oldAtt = -1;
}
//-----------------------------------------------------------------------------
//アニメーションをモデルごとを削除
void CMotion::EraseAnimInfo(int number)
{
	if(model != 0) MV1DeleteModel(model);  
    model = 0;  
}
//-----------------------------------------------------------------------------
CMotion::MOTION_STATE CMotion::GetMotionState()
{
	return tMotionState;
}
//-----------------------------------------------------------------------------
void CMotion::SetAnimeInfo(CMotion::MOTION_STATE AnimeInfo)
{
	AnimeInfo = tMotionState;
}
main.cpp

コード:

#include "DxLib.h"
#include "Input.h"
#include "Stage.h"
#include "Camera.h"
#include "PlayerModel.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

#define ISLAND (0)
#define MIKU (0)
#define BACK (1)
const int MaxStage = 2;
typedef struct CAMERA_DATA;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
		ChangeWindowMode(TRUE);
		SetGraphMode(1280 ,720 ,32 );	// 画面モードの設定
        // DXライブラリ初期化処理
		if( DxLib_Init() < 0 )
		{
			// エラーが発生したら直ちに終了
			return -1 ;
		}
		SetDrawScreen( DX_SCREEN_BACK );
		CInput* input = new CInput();
		CCamera* camera = new CCamera();
		CCamera::CAMERA_DATA CameraInfo;
		camera->CameraInit(320.0f,	240.0f,  -400.0f, 320.0f, 240.0f, -280.0f, 0.0f, 1.0f, 0.0f);
		CameraInfo = camera->GetCameraParam();
		camera->CameraSet(CameraInfo);
		CMotion* motion = new CMotion();
		CMotion::MOTION_STATE MotionInfo;
		MotionInfo = motion->GetMotionState();
		CPlayerModel* playermodel = new CPlayerModel();
		CPlayerModel::PLAYER_PARAM PlayerInfo;
		playermodel->LoadFile(MIKU, "PlayerModel/Miku/Miku.mv1");					//キャラクターのモデルの読み込み
		playermodel->SetPlayerPos(MIKU, 320.0f, 225.0f, -280.0f);								//プレイヤーモデルの初期位置
		PlayerInfo = playermodel->GetPlayerParam();												// 描画先を裏画面にする
		//古いアニメーション情報を削除
		motion->EraseAnimInfo(MotionInfo.NowAnimNum);
		//アニメーション情報を初期化
		motion->InitAnime(MotionInfo.NowAnimNum, PlayerInfo.PlayerModel[MIKU], 0);
		MotionInfo.AnimSpd = 600;
		MotionInfo.AnimeState = 0;
		motion->SetAnimeInfo(MotionInfo);
		while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0  && input->gpUpdateKey() == 0)
		{
			input->UpdatePad();
			//キャラの移動
			/*if(input->Key1[KEY_INPUT_RIGHT] != 0)
			{
				PlayerInfo.PlayerPos.x += 10;
			}
			else if(input->Key1[KEY_INPUT_LEFT] != 0)
			{
				PlayerInfo.PlayerPos.x -= 10;
			}
			else if(input->TriggerPad & PAD_INPUT_UP)
			{
				PlayerInfo.PlayerPos.y += 10;
			}
			else if(input->TriggerPad & PAD_INPUT_DOWN)
			{
				PlayerInfo.PlayerPos.y -= 10;
			}
			else if(input->Key1[KEY_INPUT_RETURN] != 0)
			{
				PlayerInfo.PlayerPos.z += 10;
			}
			else if(input->Key1[KEY_INPUT_BACK] != 0)
			{
				PlayerInfo.PlayerPos.z -= 10;
			}
			else if(input->Key1[KEY_INPUT_SPACE] != 0)
			{
				break;
			}*/
			playermodel->SetPlayerPos(MIKU, PlayerInfo.PlayerPos.x, PlayerInfo.PlayerPos.y, PlayerInfo.PlayerPos.z);
			playermodel->DrawPlayerModel(MIKU);	//キャラの描画
			motion->DrawModel(MIKU);
			DrawFormatString(100, 340, 0x666666,"X %f Y %f Z %f", PlayerInfo.PlayerPos.x, PlayerInfo.PlayerPos.y, PlayerInfo.PlayerPos.z);  
		}
		playermodel->Unload(MIKU);
		delete playermodel;
        WaitKey();      // キー入力待ち
        DxLib_End();    // DXライブラリ終了処理
        return 0;
}
一応プロジェクトもアップしておきました
http://firestorage.jp/download/3990ea84 ... 9e014459d9

どこが原因かさっぱりわからず困っております。
何度も質問してばかりでご迷惑をおかけいたしますが、どうかよろしくお願い致します

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: モーション再生について

#2

投稿記事 by h2so5 » 10年前

デバッグしない限り原因は分かりません。
MV1AttachAnimなどのDXライブラリの関数は戻り値で呼び出しが成功しているかどうか判断できます。
それらをすべてチェックしましょう。

north

Re: モーション再生について

#3

投稿記事 by north » 10年前

>h2so5様
早速のご回答ありがとうございます。
一応変数の中の数値やステップ実行等でチェックはしてみたのですがすべて問題ないように見えたので
関数まではチェックしておりませんでした。
一応チェックして見たいと思います。

下記のサイトで同じ質問をさせていただきました。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=3407

ARCS

Re: モーション再生について

#4

投稿記事 by ARCS » 10年前

CMotionのtMotionState.StartTimeが初期化されていないので、正しいモーションの再生時間が設定されない。

CMotionが持っているモデルは、MV1DuplicateModelで複製されたものなので、
CPlayerModelで位置等を操作しても、CMotionの方のモデルには反映されません。
ですので、モーションしているモデルは画面に写る位置にありません。

モーションしないモデルが表示されてるのは、motion->DrawModel(MIKU);だけでなくplayermodel->DrawPlayerModel(MIKU);も呼び出してるからです。

north

Re: モーション再生について

#5

投稿記事 by north » 10年前

>ARCS様
質問に対してご回答ありがとうございます。

アドバイスを基にまず、モデルとモーションのクラスを別にしてややこしくなっていましたので1つのクラスにまとめました。
それを基に修正したのですが、モデルが表示されなくなり、やはり原因がわからない状態です。
もし、まだMV1DuplicateModelで作成したモデルに座標がわたっていないとしたらどのように修正すればよろしいでしょうか?
ご覧になっている皆様、重ね重ね申し訳ありませんがよろしくお願い致します。
下記が修正したコードと修正いたしましたプログラムをアップしたサイトです。
Model.h

コード:

#ifndef MODELH
#define MODELH

#include <stdio.h>
#include <string.h>
#include <iostream>
#include "DxLib.h"
using namespace std;

#define PLAYER_MODEL_NUM 6

class CModel
{
public:
	typedef struct
	{
		int PlayerModel[PLAYER_MODEL_NUM];
		VECTOR PlayerPos;
		float PlayerRollX;
		float PlayerRollY;
		float PlayerRollZ;
		float AnimTime;
		int TotalTime;
		int Time; //時間
		int AnimSpd;
		int AnimeTime; //現在のアニメーションの再生開始時間
		int NowAnimNum; //現在のアニメーション番号
		int NowAttachNum; //現在のアタッチ番号
		int AnimeState;
		int oldNumber;    //古いアニメーション番号  
		int oldAtt;  //古いアタッチ番号  
		int oldStartTime;
		int StartTime;  //現在のアニメーションの再生開始時刻  
		int ANIMBLENDTIME;  //ブレンドする時間(ミリ秒)
	}PLAYER_PARAM;
private:
	PLAYER_PARAM tPlayerParam;
	int model; //モデルハンドル
	bool PauseFlag;
	enum AnimeState{RUN};
	VECTOR FirstPos; //モデルの初期位置
public:
	CModel();
	virtual ~CModel();
	int LoadFile(int ModelNum, string FileName);
	void Unload(int ModelNum);
	void SetPlayerPos(int ModelNum, float PosX, float PosY, float PosZ);
	PLAYER_PARAM GetPlayerParam();
	void DrawModel(int ModelNum);
	void Anime();
	void InitAnime(int number, int srcmodel, int firstanime);
	void EraseAnimInfo(int number);
	void StepAnimTimeSub(int anim, int attach, int start);
	void StepAnimTime(int animindex);
	void SetPos(float x, float y, float z);
	void SetAnimeInfo(CModel::PLAYER_PARAM AnimeInfo);
};
#endif
model.cpp

コード:

#include"DxLib.h"
#include"Model.h"
#include "Camera.h"
#include <Math.h>

#define PI 3.141592654



CModel::CModel()
{
	memset(&tPlayerParam, 0, sizeof(tPlayerParam));
	tPlayerParam.ANIMBLENDTIME = 30;
	tPlayerParam.AnimSpd = 685;
	/*tPlayerParam.Time = 0;
	PauseFlag = false;
	tMotionState.AnimeState = RUN;
	tMotionState.TotalTime = 0;
	tMotionState.NowAttachNum = MV1AttachAnim(model, RUN);
	tMotionState.NowAnimNum = 0;
	tMotionState.ANIMBLENDTIME = 30;
	tMotionState.AnimSpd = 685;*/
}

CModel::~CModel()
{}
//------------------------------------------------------------
int CModel::LoadFile(int ModelNum, string FileName)
{
	//SetUseASyncLoadFlag(TRUE);
	tPlayerParam.PlayerModel[ModelNum] = MV1LoadModel(FileName.c_str());
	//SetUseASyncLoadFlag(FALSE);
	if(tPlayerParam.PlayerModel[ModelNum] == -1)
	{
		return -1;
	}
	//MV1SetScale(tPlayerParam.PlayerModel[ModelNum], VGet(1, 1, 1));
	//読み込み成功
	return 1;
}
//-------------------------------------------------------------
void CModel::Unload(int ModelNum)
{
	if(tPlayerParam.PlayerModel[ModelNum] != 0)
	{
			MV1DeleteModel(tPlayerParam.PlayerModel[ModelNum]);
	}
}
//-------------------------------------------------------------
void CModel::SetPlayerPos(int ModelNum, float PosX, float PosY, float PosZ)
{
	tPlayerParam.PlayerPos.x= PosX;
	tPlayerParam.PlayerPos.y = PosY;
	tPlayerParam.PlayerPos.z = PosZ;
	MV1SetPosition( tPlayerParam.PlayerModel[ModelNum], VGet(tPlayerParam.PlayerPos.x, tPlayerParam.PlayerPos.y, tPlayerParam.PlayerPos.z));
}
//--------------------------------------------------------------
CModel::PLAYER_PARAM CModel::GetPlayerParam()
{
	return tPlayerParam;
}
//-----------------------------------------------------------------------------
//メインのアニメーションの時間を設定
void CModel::StepAnimTimeSub(int anim, int attach, int start)
{
	int totaltime = (int)(MV1GetAttachAnimTotalTime(anim, attach) * 1000.0f);
	tPlayerParam.TotalTime = totaltime;
	//アニメーション時間を算出して設定(MMDでは1フレーム=1/30秒なので補正が必要
	float animtime = 0.0f;
	if(totaltime == 0) animtime = 0.0f;  
	else 
	{  
		int progressTime = tPlayerParam.Time - start;
		animtime = (float)(progressTime * tPlayerParam.AnimSpd % totaltime) / 1000.0f;  
	}  
	MV1SetAttachAnimTime(anim, attach, animtime);
	//clsDx();printfDx("%6.3f\n", animtime);//時間チェック  
	//printfDx("%d\n", Att);//アタッチ番号チェック*/
	//printfDx("%d\n", Time);
}
//-----------------------------------------------------------------------------
//アニメーション進行
void CModel::StepAnimTime(int animindex)
{
	if(tPlayerParam.NowAnimNum != animindex)
	{  
        //古い物をデタッチ  
        if(tPlayerParam.oldAtt != -1)
		{  
            MV1DetachAnim(model, tPlayerParam.oldAtt);  
            tPlayerParam.oldAtt = -1;  
        }  
        //古い情報を待避  
        tPlayerParam.oldNumber = tPlayerParam.NowAnimNum;  
        tPlayerParam.oldAtt = tPlayerParam.NowAttachNum;  
		tPlayerParam.oldStartTime = tPlayerParam.StartTime;
        //新しいアニメーションをアタッチ  
        tPlayerParam.NowAnimNum = animindex;  
        tPlayerParam.NowAttachNum = MV1AttachAnim(model, tPlayerParam.NowAnimNum);  
        //再生開始時間を記憶  
        tPlayerParam.StartTime = tPlayerParam.Time; 
    }

	StepAnimTimeSub(model, tPlayerParam.NowAttachNum, tPlayerParam.StartTime);

	//ブレンドが必要かどうか
	int time = tPlayerParam.Time - tPlayerParam.StartTime;
	if(time < tPlayerParam.ANIMBLENDTIME && tPlayerParam.oldAtt != -1)
	{
		float brate = (float)time / (float)tPlayerParam.ANIMBLENDTIME;
		MV1SetAttachAnimBlendRate(model, tPlayerParam.NowAttachNum, brate);
		//古いアニメーションのブレンドと時間設定
		MV1SetAttachAnimBlendRate(model, tPlayerParam.oldAtt, 1.0f-brate);
		StepAnimTimeSub(model, tPlayerParam.oldAtt, tPlayerParam.oldStartTime);
	}
	else 
	{
		//ブレンドレートを1にする
		MV1SetAttachAnimBlendRate(model, tPlayerParam.NowAttachNum, 1.0f);
		//古いものをデタッチ
		if(tPlayerParam.oldAtt != -1)
		{
			MV1DetachAnim(model, tPlayerParam.oldAtt);
			tPlayerParam.oldAtt = -1;
		}
	}
}
//-----------------------------------------------------------------------------
void CModel::DrawModel(int ModelNum)
{
	if(PauseFlag == false)
	{
		tPlayerParam.Time++;
	}
	float r = (float)(tPlayerParam.Time % 10000) / (10000.0f / 360.0f) * PI / 180.0f;

	MATRIX m1 = MGetRotY(r);
	MATRIX m2 = MGetTranslate(tPlayerParam.PlayerPos);
	MATRIX m4 = MGetTranslate(VGet(40, 0, 0));
	MATRIX m3 = MMult(m4, m1); //行列を掛け合わせる
	MATRIX m5 = MMult(m3, m2);

	//アニメーション設定  
    StepAnimTime(tPlayerParam.AnimeState);

	//MV1SetPosition(model, FirstPos);
	MV1DrawModel(model);
}
//-----------------------------------------------------------------------------
//モデルを複製し、初期状態のアニメーションを設定
void CModel::InitAnime(int number, int srcmodel, int firstanime)
{
	model = MV1DuplicateModel(srcmodel);
	tPlayerParam.NowAttachNum = MV1AttachAnim(model, firstanime);
	tPlayerParam.oldAtt = -1;
}
//-----------------------------------------------------------------------------
//アニメーションをモデルごとを削除
void CModel::EraseAnimInfo(int number)
{
	if(model != 0) MV1DeleteModel(model);  
    model = 0;  
}
//-----------------------------------------------------------------------------
void CModel::SetAnimeInfo(CModel::PLAYER_PARAM AnimeInfo)
{
	AnimeInfo = tPlayerParam;
}
main.cpp

コード:

#include "DxLib.h"
#include "Input.h"
#include "Stage.h"
#include "Camera.h"
#include "Model.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

#define ISLAND (0)
#define MIKU (0)
#define BACK (1)
const int MaxStage = 2;
typedef struct CAMERA_DATA;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
		ChangeWindowMode(TRUE);
		SetGraphMode(1280 ,720 ,32 );	// 画面モードの設定
        // DXライブラリ初期化処理
		if( DxLib_Init() < 0 )
		{
			// エラーが発生したら直ちに終了
			return -1 ;
		}
		SetDrawScreen( DX_SCREEN_BACK );
		CInput* input = new CInput();
		CCamera* camera = new CCamera();
		CCamera::CAMERA_DATA CameraInfo;
		camera->CameraInit(320.0f,	240.0f,  -400.0f, 320.0f, 240.0f, -280.0f, 0.0f, 1.0f, 0.0f);
		CameraInfo = camera->GetCameraParam();
		camera->CameraSet(CameraInfo);
		CModel* model = new CModel();
		CModel::PLAYER_PARAM PlayerInfo; 
		model->LoadFile(MIKU, "PlayerModel/Miku/Miku.mv1");					//キャラクターのモデルの読み込み
		model->SetPlayerPos(MIKU, 320.0f, 225.0f, -280.0f);								//プレイヤーモデルの初期位置
		PlayerInfo = model->GetPlayerParam();												// 描画先を裏画面にする
		//古いアニメーション情報を削除
		model->EraseAnimInfo(PlayerInfo.NowAnimNum);
		//アニメーション情報を初期化
		model->InitAnime(PlayerInfo.NowAnimNum, PlayerInfo.PlayerModel[MIKU], 0);
		PlayerInfo.AnimeState = 0;
		model->SetAnimeInfo(PlayerInfo);
		while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0  && input->gpUpdateKey() == 0)
		{
			input->UpdatePad();
			//キャラの移動
			/*if(input->Key1[KEY_INPUT_RIGHT] != 0)
			{
				PlayerInfo.PlayerPos.x += 10;
			}
			else if(input->Key1[KEY_INPUT_LEFT] != 0)
			{
				PlayerInfo.PlayerPos.x -= 10;
			}
			else if(input->TriggerPad & PAD_INPUT_UP)
			{
				PlayerInfo.PlayerPos.y += 10;
			}
			else if(input->TriggerPad & PAD_INPUT_DOWN)
			{
				PlayerInfo.PlayerPos.y -= 10;
			}
			else if(input->Key1[KEY_INPUT_RETURN] != 0)
			{
				PlayerInfo.PlayerPos.z += 10;
			}
			else if(input->Key1[KEY_INPUT_BACK] != 0)
			{
				PlayerInfo.PlayerPos.z -= 10;
			}
			else if(input->Key1[KEY_INPUT_SPACE] != 0)
			{
				break;
			}*/
			model->SetPlayerPos(MIKU, PlayerInfo.PlayerPos.x, PlayerInfo.PlayerPos.y, PlayerInfo.PlayerPos.z);
			model->DrawModel(MIKU);
			DrawFormatString(100, 340, 0x666666,"X %f Y %f Z %f", PlayerInfo.PlayerPos.x, PlayerInfo.PlayerPos.y, PlayerInfo.PlayerPos.z);  
		}
		model->Unload(MIKU);
		delete model;
        WaitKey();      // キー入力待ち
        DxLib_End();    // DXライブラリ終了処理
        return 0;
}
下記がプロジェクトをアップしたサイトのURLです
http://firestorage.jp/download/797fa150 ... d0f4fff206

もしほかに修正等したら良い点がございましたらご指摘よろしくお願い致します。

north

Re: モーション再生について

#6

投稿記事 by north » 10年前

モデルが表示されないバグについては修正できました。
model.cppの146行目を誤ってコメントアウトしており、ここのコメントアウトを解除し
FirstPosにtPlayerParam.Posでモデルの座標を渡すことで修正されました。
ただ、肝心のモーション再生なのですがモーションの初期のポーズのまま動かない状態となっております。
こちらだけどうしても原因がわからず困っております。
どうかこの原因と解決方法を教えていただけたらと思います。
どうかよろしくお願い致します。

north

Re: モーション再生について

#7

投稿記事 by north » 10年前

モーションが再生されないバグも無事に解決いたしました。
原因はPauseFlagの初期化忘れでした。
単純なミスでお騒がせして申し訳ありませんでした。
またわからないところが出てきた際はよろしくお願い致します。

閉鎖

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