Model 2

Win10 Model 2

Windows10 DirectX3D で2体のモデルを親子関係で回転します。

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

モデルを並べて描画

  1. Windows10 で CreateModel と MyCamera を組み込んで、2体のモデルを親子関係で回転します。
    3Dアニメーションの基本は、複数のモデル(パーツ)を組み合わせて回転(移動)することです。
    今回はモデル1の周りをモデル2が回ります。
    最初に、二体のモデルを並べて描画するプロジェクトを作成します。
  2. Win10 Template を参照して DirectX 11 アプリ(ユニバーサル Windows) を生成して下さい。
  3. [DirectX Page 検索]を参照して「頂点+法線」のモデルを描画出来るように修正して下さい。
    Class CreateModel と Class MyCamera を組み込んで、多角錐のモデルを描画します。
  4. Rotate() 関数でモデル1をY軸で,モデル2をX軸で回転しています。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        my_camera1->Model(0.0f, radians, 0.0f);
        my_camera2->Model(radians, 0.0f, 0.0f);
    }
    
  5. 詳細は Win10 Pair を参照して下さい。
    MyCamera のソースコードも掲載しています。

親子関係で回転

  1. 2体のモデルを並べて描画できたら、親子関係で回転します。
    モデル1,モデル2のカメラの設定です。
    m_eye は MyCamera.h で次のように定義されています。
        DirectX::XMVECTOR   m_eye = { 0.0f, 0.7f, 10.0f, 0.0f };
    
    Sample3DSceneRenderer::Sample3DSceneRenderer(const std::shared_ptr<DX::DeviceResources>& deviceResources) :
        m_loadingComplete(false),
        m_degreesPerSecond(45),
        m_tracking(false),
        m_deviceResources(deviceResources)
    {
        CreateDeviceDependentResources();
        CreateWindowSizeDependentResources();
        my_camera1 = new MyCamera(m_deviceResources);
        my_camera2 = new MyCamera(m_deviceResources);
    }
    
  2. モデル1は画面中央でY軸を中心に自転します。
    モデル2は Camera Class の Model() 関数で回転します。
    Model() 関数の先頭パラメータは回転半径です。
    X軸, Y軸, Z軸の順に試してみて下さい。
    Z軸で回転するときは、Xパラメータにも 1.0f を設定して下さい。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        my_camera1->Model(0.0f, radians, 0.0f);
        my_camera2->Model(3.0f, radians, 0.0f, 0.0f);       // X軸回転 
        //my_camera2->Model(5.0f, 0.0f, -radians, 0.0f);    // Y軸回転 
        //my_camera2->Model(4.0f, 1.0f, 0.0f, radians);     // Z軸回転 
    }
    
  3. Render() 関数は修正の必要は無く、モデル1に続いてモデル2を描画します。

カメラで回転

  1. モデル2をカメラを操作して回転してみます。
    View() 関数を使うとカメラの座標が回転します。
    モデル1は画面中央でY軸を中心に自転します。
    モデル2はX座標を 0.3f ずらしてZ軸で回転します。
    カメラはZ軸方向からX,Y面を映しているのでモデル2はモデル1の周りを円状に回転します。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        my_camera1->Model(0.0f, radians, 0.0f);
        my_camera2->View(0.3f, 0.0f, 0 - radians);
    }
    
  2. Z軸ではうまく回転出来たのですが、X軸回転, Y軸回転では回転半径が大きくなりすぎます。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        my_camera1->Model(0.0f, radians, 0.0f);
        //my_camera2->View(radians, 0.0f, 0.0f);        // 回転半径が大きくなりすぎる
        //my_camera2->View(0.0f, radians, 0.0f);        // 回転半径が大きくなりすぎる
    }
    

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