Table Animation

インクレディブル婦人の腕の動きを Table で定義します。

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

プログラムの説明

  1. 下腕と手首の姿勢を Table で定義してアニメーションします。
    Sample3DSceneRenderer.h に下腕と手首の姿勢をデータを定義します。
    t_Pose[5][2] の二次元配列でポーズを定義します。
    [5]がポーズの数で、0,2,4が腕をまっすぐ伸ばしたポーズです。
    1が腕を上げたポーズで、3が腕を下げたポーズです。
    [2]がモデルの指定で、前[0]が下腕のモデルを後[1]が手首のモデルです。
    アニメーションは「0⇒1⇒2⇒3⇒4」を100分割して動かします。
    t_cnt は100分割のカウンターです。
        // モデルポーズテーブル
        float3  t_Pose[5][2] =  {
        { float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f) }, 
        { float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.5f) }, 
        { float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f) }, 
        { float3(0.0f, 0.0f, -1.0f), float3(0.0f, 0.0f, -0.3f) }, 
        { float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f) } };
        int     t_cnt;
    
  2. Sample3DSceneRenderer.cpp の Constructor でアニメーションの初期化をします。
    m_pivot は親モデルからの相対位置です。
        CreateDeviceDependentResources();
        CreateWindowSizeDependentResources();
        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);
        t_cnt = 0;
    
  3. Rotate() 関数からモデル2とモデル3の Update() 関数を呼び出します。
    戻り値が true(t_cnt==0)のとき SetRot() 関数でポーズを切り替えます。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        if (camera[1]->Update())    SetRot();
        else    camera[2]->Update();
    }
    
  4. ポーズを切り替える SetRot() 関数です。
    t_cnt と t_cnt+1 番目の t_Pose[5][2] を参照して m_rot と m_dtrot を設定します。
    ポーズ間の動きを100分割して m_dtrot に格納します。
    これで Anime Camera と同様にアニメーションされます。
    void Sample3DSceneRenderer::SetRot()
    {
        camera[1]->m_num = 100;
        camera[1]->m_rot = t_Pose[t_cnt][0];
        camera[1]->m_dtrot.x = (t_Pose[t_cnt+1][0].x-t_Pose[t_cnt][0].x)/100.0f;
        camera[1]->m_dtrot.y = (t_Pose[t_cnt+1][0].y-t_Pose[t_cnt][0].y)/100.0f;
        camera[1]->m_dtrot.z = (t_Pose[t_cnt+1][0].z-t_Pose[t_cnt][0].z)/100.0f;
        camera[2]->m_num = 100;
        camera[2]->m_rot = t_Pose[t_cnt][1];
        camera[2]->m_dtrot.x = (t_Pose[t_cnt+1][1].x-t_Pose[t_cnt][1].x)/100.0f;
        camera[2]->m_dtrot.y = (t_Pose[t_cnt+1][1].y-t_Pose[t_cnt][1].y)/100.0f;
        camera[2]->m_dtrot.z = (t_Pose[t_cnt+1][1].z-t_Pose[t_cnt][1].z)/100.0f;
    
        t_cnt++;
        if (t_cnt>3)    t_cnt = 0;
    }
    

上腕を加える

  1. アニメーション対象に上腕を追加します。
    Sample3DSceneRenderer.h に上腕と下腕と手首の姿勢をデータを定義します。
    t_Pose[5][3] の二次元配列でポーズを定義します。
    [3]がモデルの指定で、前[0]が上腕で, 中[1]が下腕で, 後[2]が手首です。
    アニメーションは「0⇒1⇒2⇒3⇒4」を100分割して動かします。
    t_cnt は100分割のカウンターです。
        // モデルポーズテーブル
        float3  t_Pose[5][3] =  {
        { float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f) }, 
        { float3(0.0f, 1.0f, 0.0f), float3(0.0f, 0.0f, 1.0f), float3(0.0f, 0.0f, 0.5f) }, 
        { float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f) }, 
        { float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, -1.0f), float3(0.0f, 0.0f, -0.3f) }, 
        { float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f) } };
        int     t_cnt;
    
  2. Sample3DSceneRenderer.cpp の Constructor でアニメーションの初期化をします。
    m_pivot は親モデルからの相対位置です。
    上腕を動かすと「上腕と下腕の接続」が気になるので、下腕の m_pivot を -0.6 に修正しています。
        CreateDeviceDependentResources();
        CreateWindowSizeDependentResources();
        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.6f);
        camera[2]->m_pivot = camera[2]->f3(-5.0f,0.0f,0.0f);
        t_cnt = 0;
    
  3. Rotate() 関数からモデル1とモデル2とモデル3の Update() 関数を呼び出します。
    戻り値が true(t_cnt==0)のとき SetRot() 関数でポーズを切り替えます。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        if (camera[0]->Update())
        {   SetRot();  }
        else
        {   camera[1]->Update();
            camera[2]->Update();
        }
    }
    
  4. ポーズを切り替える SetRot() 関数です。
    t_cnt と t_cnt+1 番目の t_Pose[5][3] を参照して m_rot と m_dtrot を設定します。
    ポーズ間の動きを100分割して m_dtrot に格納します。
    t_cnt は「0から3」を繰り返します。
    void Sample3DSceneRenderer::SetRot()
    {
        for(int i=0; i<3; i++)
        {
            camera[i]->m_num = 100;
            camera[i]->m_rot = t_Pose[t_cnt][i];
            camera[i]->m_dtrot.x = (t_Pose[t_cnt + 1][i].x - t_Pose[t_cnt][i].x) / 100.0f;
            camera[i]->m_dtrot.y = (t_Pose[t_cnt + 1][i].y - t_Pose[t_cnt][i].y) / 100.0f;
            camera[i]->m_dtrot.z = (t_Pose[t_cnt + 1][i].z - t_Pose[t_cnt][i].z) / 100.0f;
        }
    
        t_cnt++;
        if (t_cnt>3)    t_cnt = 0;
    }
    

[Next Chapter ↓] Text Input
[Previous Chapter ↑] Anime Camera

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