TOYSTUDIO SDK  1.6.1.3
 全て クラス ファイル 関数 変数 型定義 列挙型 列挙型の値 マクロ定義 グループ ページ
アニメーション

キー フレームとは

TOYSTUDIOでは、フレーム(フィルムにおける1コマ)単位で時間を管理します。 実際にデータのセットされたフレームをキー フレームと言い、 データのセットされていないフレームについては、 キー フレームのデータをスプライン曲線などで補間して算出されます。

フレーム レートとは

アニメーション再生スピード(1秒当たりのフレーム数)をフレーム レートと言い、 CTaAnim::GetFps() で取得、 CTaAnim::SetFps() でセットします。

アニメーション アイテム

アニメーション(CTaAnim)は、 アニメーションを行うデータごとにアニメーション アイテム(CTaAnimItem)を持ちます。 アニメーション アイテムはキー フレームのリストを保持しており、 データのスプライン補間などを行います。

アニメーション アイテムは、 CTaAnim::GetObjectItem() で取得、 CTaAnim::CreateObjectItem() で追加します。

キー フレームの追加

アニメーション アイテム(CTaAnimItem)のキー フレームは、 CTaAnimItem::InsertKeyFrame() で追加します。 キー フレームの追加の際にはスプライン曲線を更新する必要があり、 一つのキー フレームを追加する場合はこの関数のbUpdateSpline引数をTRUEにして実行します。

また、複数のキー フレームを追加する場合は、

//キー フレームのループ
for(UINT i = 0; i < nKeys; ++i)
{
//キー フレームの追加
float KeyFrame = 〜;
float Value = 〜;
pAnimItem->InsertKeyFrame(KeyFrame, Value);
}
//スプライン曲線の更新
pAnimItem->UpdateSpline();

のように、 CTaAnimItem::InsertKeyFrame() のbUpdateSpline引数をFALSEにして複数回実行し、 最後に CTaAnimItem::UpdateSpline() でスプライン曲線を更新するのが効率的です。

指定フレームでアニメーション

プラグインのエクスポート機能を作成する場合、 ファイル出力処理の内部において、 指定フレームについてのアニメーションを実行することが必要な場合があります。 例えば、 サンプル プロジェクトのSamplePluginの「.txt2」ファイルの出力処理においては、 アニメーションのフレーム番号でループさせながらオブジェクト(CTaObject)の変換行列を出力しています。 このような場合、以下のように処理を行います。

アニメーション バリュー(CTaAnimValues)を作成し、 CTaAnimValues::StoreObjectValues() でオブジェクトの現在のデータを保持しておきます。

pAnimValues->StoreObjectValues(pAnim, pObject);


CTaAnim::AnimateObjectItems() で指定フレームについてのオブジェクトのアニメーションを実行します。

float Frame = 〜;
pAnim->AnimateObjectItems(Frame, pObject);


この時点でオブジェクトに関するアニメーション データは更新されているので、 CTaObject::GetTransform() でオブジェクトのローカル変換行列を取得したりなどできます。

オブジェクトのデータの取得が終わったら、 CTaAnimValues::Restore() でオブジェクトのデータを復元し、 最後にアニメーション バリュー(CTaAnimValues)を削除します。

pAnimValues->Restore(pAnim);
TaDeleteAnimValues(pAnimValues);

IKハンドルのアニメーション

IKハンドルのような制約(コンストレイント)用のオブジェクトは、 ソフトウェアによって仕様が異なります。 よってファイル出力処理などにおいては、 IKハンドル自体にセットされた姿勢アニメーションを、 IKハンドルが参照しているオブジェクトの姿勢アニメーションに変換する必要が出てきます。 サンプル プロジェクトのSamplePluginでは、 この変換処理を利用してファイル出力を行っています。

まず、複製用のアニメーション(CTaAnim)を作成し、 これを引数にして CTaAnim::GetConstrainedObjectItems() を実行します。 この関数は、IKハンドル自体にアニメーションがセットされている場合、 IKハンドルが参照しているオブジェクトのアニメーションに変換してコピーします。

CTaAnim* pDupAnim = TaCreateAnim();
if(pAnim->GetConstrainedObjectItems(pDupAnim, 1.0f, TRUE))
{
}


複製したアニメーションを用いてデータの出力などを行います。

CTaAnimItem* pItem = pDupAnim->GetObjectItem(TA_ANIM_ITEM_TRANSLATE_X, pObject);
if(pItem)
{
}


使用が終わったら、複製したアニメーションを削除します。

TaDeleteAnim(pDupAnim);