Anime Camera

インクレディブル婦人の腕を Anime Camera で動かします。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. インクレディブル婦人の腕(上腕, 下腕, 手首)を組み合わせてアニメーションします。
    Hand Model では、腕を組み合わせてスムースに動くようになったのですが、外部からデータを与えて自動的にアニメーションするには向いていません。
    そこで自動的にアニメーションするのに向いている AnimeCamera Class を作成します。
    MyCamera Class を元に少し修正するだけです。
  2. MyCamera.h(.cpp) を AnimeCamera.h(.cpp) に名前を変更して下さい。
    AnimeCamera.h に次の領域を定義します。
    m_pivot, m_rot は MyCamera と同じで、親からの相対位置と回転情報です。
    m_dtrot, m_dtmov はフレームごとに m_rot, m_pivot に加える値です。
    m_num は実行するフレーム数で、ゼロになると更新を止めます。
    これらの領域は Constructor でリセットして下さい。
        float3      m_pivot;    //親からの相対位置座標
        float3      m_rot;      //回転情報
        float3      m_dtrot;    //自動回転係数
        float3      m_dtmov;    //自動移動係数
        int16       m_num;      //フレームカウント(0で停止)
    
    m_rot, m_pivot を更新する関数 Update() 関数は次のようになります。
    m_dtrot, m_dtmov をフレームごとに m_rot, m_pivot に加えます。
    // 回転(移動)情報を更新
    bool AnimeCamera::Update()
    {
        m_num--;
        if (m_num<1)
        {   m_num = 0;
            return true;
        }
        m_rot.x += m_dtrot.x;
        m_rot.y += m_dtrot.y;
        m_rot.z += m_dtrot.z;
        m_pivot.x += m_dtmov.x;
        m_pivot.y += m_dtmov.y;
        m_pivot.z += m_dtmov.z;
        return false;
    }
    
  3. Sample3DSceneRenderer.cpp では Update() 関数を使ってアニメーションします。
    最初は Hand Model と同様に動かしてみましょう。
    Constructor でアニメーション関係の領域を初期化をします。
    m_dtrot がフレーム毎に更新する値で m_num がその回数です。
        camera[0] = new AnimeCamera(m_deviceResources, nullptr);
        camera[1] = new AnimeCamera(m_deviceResources, camera[0]);
        camera[2] = new AnimeCamera(m_deviceResources, camera[1]);
        camera[1]->m_pivot = camera[1]->f3(-4.0f,0.0f,0.0f);
        camera[2]->m_pivot = camera[2]->f3(-5.0f,0.0f,0.0f);
        camera[1]->m_rot = camera[2]->f3(0.0f,0.0f,-1.0f);
        camera[1]->m_dtrot = camera[2]->f3(0.0f,0.0f,0.01f);
        camera[1]->m_num = 200;
    
  4. Rotate() 関数では camera[1]->Update() でモデル1の回転情報を更新します。
    関数値が true のときは、camera[1]->m_dtrot.z のサインを逆にします。
    これで Hand Model と同様にアニメーションされます。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        if (camera[1]->Update())
        {   camera[1]->m_num = 200;
            camera[1]->m_dtrot.z = 0 - camera[1]->m_dtrot.z;
        }
    }
    

手首も動かす

  1. 下腕(モデル2)に加えて手首(モデル3)も動かします。
    Constructor でアニメーションの初期化をします。
    m_dtrot がフレーム毎に更新する値で m_num がその回数です。
    下腕は200フレームですが手首は130フレームに設定してみました。
    周期がずれているので同じ繰り返しにはなりません。
        camera[0] = new AnimeCamera(m_deviceResources, nullptr);
        camera[1] = new AnimeCamera(m_deviceResources, camera[0]);
        camera[2] = new AnimeCamera(m_deviceResources, camera[1]);
        // アニメーションの設定
        camera[1]->m_rot = camera[2]->f3(0.0f,0.0f,-1.0f);
        camera[1]->m_dtrot = camera[2]->f3(0.0f,0.0f,0.01f);
        camera[1]->m_num = 200;
        camera[2]->m_rot = camera[2]->f3(0.0f,0.0f,-0.5f);
        camera[2]->m_dtrot = camera[2]->f3(0.0f,0.0f,0.01f);
        camera[2]->m_num = 130;
    
  2. Rotate() 関数では camera[1]->Update() と camera[2]->Update() でモデルの回転情報を更新します。
    Update() の戻り値が true のときは、サインを逆にします。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        if (camera[1]->Update())
        {   camera[1]->m_num = 200;
            camera[1]->m_dtrot.z = 0 - camera[1]->m_dtrot.z;
        }
        if (camera[2]->Update())
        {   camera[2]->m_num = 130;
            camera[2]->m_dtrot.z = 0 - camera[2]->m_dtrot.z;
        }
    }
    
  3. 簡単にアニメーションが出来るようになったでしょう。
    色々試してみて下さい。

[Next Chapter ↓] Table Anime
[Previous Chapter ↑] Hand Model

超初心者のプログラム入門(DirectX Store)