アニメーションの共有

ここではアニメーションの共有について解説します。




※ 開発環境によってダウンロードするサンプルデータが異なります。

目次





体型・形状の異なる複数のモデルに同様のアニメーションを行わせたい時、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 を関連付け
描画結果



このページの先頭へ戻る