アニメーションの共有
ここではアニメーションの共有について解説します。
※ 開発環境によってダウンロードするサンプルデータが異なります。
目次
体型・形状の異なる複数のモデルに同様のアニメーションを行わせたい時、1 つのアニメーションデータを共通で使用することが可能な機能です。
1. アニメーションの設定
アニメーションの設定は「3D モデルの描画」のドキュメントページに記述されている通常のアニメーション設定処理と変わりませんが、オーサリングツールでモデルを作成する段階で各ボーンにユーザー ID 番号を設定しておくことが重要となります。
なぜなら、各モデルのそれぞれの同一ユーザー ID 番号に対応して、アニメーションデータが設定されるようになっているからです。また、アニメーションデータの制御ボーン数以上のボーン数が存在するモデルの場合は、そのボーン部分はアニメーションが行われません。
typedef struct tagWork
{
(中略)
mceFigure *Figure0; /* Figure0 */
mceFigure *Figure1; /* Figure1 */
(中略)
mceActionTable *Acttbl0; /* ActionTable0 */
mceActionTable *Acttbl1; /* ActionTable1 */
(中略)
hi_uint8 AnimeFlag; /* アニメーションフラグ */
(中略)
hi_coord AnimeEnd0; /* オブジェクトアニメーション終了値0 */
hi_coord AnimeCounter0; /* オブジェクトアニメーションカウンター0 */
hi_coord AnimeEnd1; /* オブジェクトアニメーション終了値1 */
hi_coord AnimeCounter1; /* オブジェクトアニメーションカウンター1 */
} WORK;
hi_exception exception;
(中略)
work->AnimeFlag = 0;
(中略)
work->AnimeEnd0 = mceActionTable_getMaxFrame (work->Acttbl0);
work->AnimeCounter0 = MCE_F2C (0.0f);
work->AnimeEnd1 = mceActionTable_getMaxFrame (work->Acttbl1);
work->AnimeCounter1 = MCE_F2C (0.0f);
(中略)
if (work->AnimeFlag == 0)
{
/* Figure0とActtbl0、Figure1とActtbl1を関連付ける */
exception = mceFigure_bindAction (work->Figure0,
work->Acttbl0);
if (exception != hi_NoException)
{
return 1;
}
exception = mceFigure_bindAction (work->Figure1,
work->Acttbl1);
if (exception != hi_NoException)
{
return 1;
}
exception = mceFigure_setFrame (work->Figure0,
work->AnimeCounter0);
if (exception != hi_NoException)
{
return 1;
}
exception = mceFigure_setFrame (work->Figure1,
work->AnimeCounter1);
if (exception != hi_NoException)
{
return 1;
}
}
else
{
/* Figure0とActtbl1、Figure1とActtbl0を関連付ける */
exception = mceFigure_bindAction (work->Figure0,
work->Acttbl1);
if (exception != hi_NoException)
{
return 1;
}
exception = mceFigure_bindAction (work->Figure1,
work->Acttbl0);
if (exception != hi_NoException)
{
return 1;
}
exception = mceFigure_setFrame (work->Figure0,
work->AnimeCounter1);
if (exception != hi_NoException)
{
return 1;
}
exception = mceFigure_setFrame (work->Figure1,
work->AnimeCounter0);
if (exception != hi_NoException)
{
return 1;
}
}
同一のアクションデータを複数のモデルで使用したい場合、1 つの mceActionTable を複数の mceFigure と関連付けることができます。また、同一の mceActionTable と関連付けられた複数の mceFigure に対し、別々のアニメーション再生フレームを指定することが可能です。
hi_exception exception;
/* Figure0とFigure1でActtbl0を共有する */
exception = mceFigure_bindAction (work->Figure0, work->Acttbl0);
if (exception != hi_NoException)
{
return 1;
}
exception = mceFigure_bindAction (work->Figure1, work->Acttbl0);
if (exception != hi_NoException)
{
return 1;
}
/* アニメーション再生フレームは、個々に設定できる */
exception = mceFigure_setFrame (work->Figure0,
work->AnimeCounter0);
if (exception != hi_NoException)
{
return 1;
}
exception = mceFigure_setFrame (work->Figure1,
work->AnimeCounter1);
if (exception != hi_NoException)
{
return 1;
}
![]() |
![]() |
| Figure 0 と ActionTable 0、 Figure 1 と ActionTable 1 を関連付け |
Figure 0 と ActionTable 1、 Figure 1 と ActionTable 0 を関連付け |
| 描画結果 | |



