ページ 11

モーションを再生したい!(DxLib)

Posted: 2013年2月02日(土) 21:15
by EIYUU
このごろ3Dに手を出したのですが・・・
モーションのことがよくわかりません。
説明があったりするのですが・・・・まったくわかりません(少しは、わかる)。
ということで、こんな人でもわかるように説明していただけないでしょうか・・・。
あとコードも載せてくれたらうれしいです。

Re: モーションを再生したい!(DxLib)

Posted: 2013年2月02日(土) 22:46
by softya(ソフト屋)
モーションがあるモデル+モーションのファイルは、MMD(ミクミクダンス)などで作成することができます。
で、DXライブラリであれば、リファレンスの真似をしてもらえばアニメーションします。
「MV1AttachAnim」
http://homepage2.nifty.com/natupaji/DxL ... .html#R4N1

【追記】
ここの記事の解説が詳細です。
「わくわくプログラミング自習室 Blogs - 3D Archive」
http://i-libro.net/wpmu/blog/archives/category/3d
【DXライブラリ3D入門】モデルをアニメーションさせよう(前編)と(後編)をお読み下さい。

Re: モーションを再生したい!(DxLib)

Posted: 2013年2月03日(日) 17:57
by EIYUU
MV1AttachAnim関数の説明のとうりにやったのですが、
モーションが再生されませんでした・・・。
どういうことでしょうか?

コード:

#include"DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE),SetWindowText("Motion"),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
	SetUseZBuffer3D(TRUE);
	SetWriteZBuffer3D(TRUE);
	int Model=MV1LoadModel("Motio/とげりんご.pmd");
	MV1SetPosition(Model,VGet(320.0f,180.0f,0.0f));
	MV1SetScale(Model,VGet(5.0f,5.0f,5.0f));
	int AttachIndex,TotalTime,PlayTime;
	AttachIndex=MV1AttachAnim(Model,0,-1,FALSE);
	TotalTime=MV1GetAttachAnimTotalTime(Model,AttachIndex);
	PlayTime=0.0f;
	while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0){
				PlayTime+=100.0f;
		if(PlayTime>=TotalTime)
			PlayTime=0.0f;
		MV1SetAttachAnimTime(Model,AttachIndex,PlayTime);
		MV1DrawModel(Model);
	}
	DxLib_End();
	return 0;
}

Re: モーションを再生したい!(DxLib)

Posted: 2013年2月03日(日) 17:59
by EIYUU
コードみにくくなっていたので・・
以下がコードです

コード:

#include"DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE),SetWindowText("Motion"),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
	SetUseZBuffer3D(TRUE);
	SetWriteZBuffer3D(TRUE);
	int Model=MV1LoadModel("Motio/とげりんご.pmd");
	MV1SetPosition(Model,VGet(320.0f,180.0f,0.0f));
	MV1SetScale(Model,VGet(5.0f,5.0f,5.0f));
	int AttachIndex,TotalTime,PlayTime;
	AttachIndex=MV1AttachAnim(Model,0,-1,FALSE);
	TotalTime=MV1GetAttachAnimTotalTime(Model,AttachIndex);
	PlayTime=0.0f;
	while(ProcessMessage()==0&&ScreenFlip()==0&&ClearDrawScreen()==0){
				PlayTime+=100.0f;
		if(PlayTime>=TotalTime)
			PlayTime=0.0f;
		MV1SetAttachAnimTime(Model,AttachIndex,PlayTime);
		MV1DrawModel(Model);
	}
	DxLib_End();
	return 0;
}

Re: モーションを再生したい!(DxLib)

Posted: 2013年2月03日(日) 18:01
by softya(ソフト屋)
codeタグの使い方が間違っていますよ。

コード:

じゃなくて[code=cpp]です。
プレビューで必ず確認して投稿して下さいね。

それと、そのモデルはモーションが定義されているんでしょうか?
DXライブラリ付属ToolのDxLibModelViewer.exe でモーションが動くことを確認してみて下さい。

【確認方法の補足】
・DxLibModelViewerで該当モデルを読み込ム。
・アニメーションを選ぶ。定義されているアニメーションデータが表示される。
・テストしたいアニメーションデータを選択。
・再生を押す。

Re: モーションを再生したい!(DxLib)

Posted: 2013年2月03日(日) 18:02
by Priest
そのエラーの直接的な回答になるか分かりませんが、

PlayTime+=100.0f;

って進めすぎではないですか?
totaltimeを一瞬で上回って、Playtime=0;になっている可能性があります。

PlayTime+=1.0f;

位にしておきましょう。

Re: モーションを再生したい!(DxLib)

Posted: 2013年2月03日(日) 18:36
by EIYUU
動きました!!
ありがとうございました!!
原因は、PlayTimeを一回で100進めていたことでした!
本当にありがとうございました