前回は自己解決したのにもかかわらず、原因等を記載せずに終わってしまい申し訳ありませんでした。
今回質問したいのはモーション再生についてです。
下記のサイトを参考に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
#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;
}
#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
どこが原因かさっぱりわからず困っております。
何度も質問してばかりでご迷惑をおかけいたしますが、どうかよろしくお願い致します