ダリアメモ@ブログ

日々思ったことや自分用のメモも含めプログラムの技術を淡々と書いていきます

FBXSDKで複数アニメーション読み込み時の切り替え

お久しぶりです、約1ヶ月ぶりの記事です。


長らく滞っていましたが、
Twitterなくなったらダリアメモ出来なくなるんだから
ネット上に記事残しておきなよという友人のエール?で
今回からまた再開したいと思います。

今回はFBXSDKを使う時に、一つのファイルに複数アニメーションが有った時の読み込み方と切り替え方について書こうと思います。




まずは読み込みから。
先にコードを見せます。

    std::vector<SkeletalAnimationInfo> mSkeletalAnimations;
	//アニメーションの数を取得
	int animaStackCount = importer->GetAnimStackCount();
	mSkeletalAnimations.reserve(animaStackCount);

        for (int i = 0; i < animaStackCount; ++i)
	{

		//アニメーション情報を取得する
		FbxTakeInfo* takeInfo = importer->GetTakeInfo(i);

		//基準点からの差を取得
		auto importOffset = takeInfo->mImportOffset;
		auto startTime = takeInfo->mLocalTimeSpan.GetStart();			                //アニメーション開始時間
		auto stopTime = takeInfo->mLocalTimeSpan.GetStop();				            //アニメーション終了時間

		float start = (importOffset.Get() + startTime.Get()) / FbxTime::GetOneFrameValue(FbxTime::eFrames60);	//60フレームでの開始時間を設定
		float end = (importOffset.Get() + stopTime.Get()) / FbxTime::GetOneFrameValue(FbxTime::eFrames60);	//60フレームでの終了時間を設定

		std::string name = takeInfo->mName;


        SkeletalAnimationInfo info(name,start, end);
		mSkeletalAnimations.emplace_back(info);
	}
	


まずはFbxImporter(コードで言うimporter)からアニメーションの数を取得します。
その後にfor文をアニメーションの数分回して、GetTakeInfo(インデックス番号)で取得するアニメーションを切り替えています。
切り替えがきちんと出来てるか確認用でアニメーションの名前と、
アニメーションさせると行列計算するので開始フレームと終了フレームが欲しかったので
計算した後にメンバ変数(今回はSkeletalAnimationInfoという自前の構造体でやってます)に値を格納して
vectorであるmSkeletalAnimations変数に次々と要素を追加していってます
名前で切り替えやれるようにした方がいいのかなーと思いましたが、
頻繁に切り替わることを考えるとvectorの方がインデックス番号渡すだけだし
そっちのほうがいいかなと思ってvectorで今回やってます。

次にアニメーションの切り替え。



        int index = 0;
   
	FbxAnimStack* pStack = Scene->GetSrcObject<FbxAnimStack>(index);
	
	Scene->SetCurrentAnimationStack(pStack);

ここはそんなに大したことしてないですね。
まずはFbxScene(コードで言うScene)に登録されているStackというアニメーションの情報が入ってるクラスを取得しています。
その後に取得したStackをそのままScene->SetCurrentAnimationStackで現在のアニメーションをStackのアニメーションに変更してあげているだけです。


やってることはそこまで難しくないですが、
あんまりネット上に転がっていたなかった気がしますので
少し苦労しましたが、僕みたいに苦労している人が居て役に立てるのなら幸いです。