Model 3

Win10 Model 3

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

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

プログラムの説明

  1. Windows10 で CreateModel と MyCamera を組み込んで、3体のモデルを親子孫関係で回転します。
    3Dアニメーションの基本は、複数のモデル(パーツ)を組み合わせて回転(移動)することです。
    Win10 Model 2 を参照して親子で回転するプロジェクトを作成して下さい。
  2. Sample3DSceneRenderer.h に CreateModel と MyCamera を組み込んで、3体のモデル領域を配列で定義します。
    #include "CreateModel.h"
    #include "MyCamera.h"
    
        Microsoft::WRL::ComPtr<ID3D11Buffer>        m_vertexBuffer[3];
        Microsoft::WRL::ComPtr<ID3D11Buffer>        m_indexBuffer[3];
    
        uint32          m_indexCount[3];
        CreateModel     *m_CreateModel;
        MyCamera        *my_camera[3];
    
  3. Sample3DSceneRenderer.cpp の Constructor で CreateModel と MyCamera を設定します。
    Sample3DSceneRenderer::Sample3DSceneRenderer(const std::shared_ptr<DX::DeviceResources>& deviceResources) :
        m_loadingComplete(false),
        m_degreesPerSecond(45),
        m_tracking(false),
        m_deviceResources(deviceResources)
    {
        CreateDeviceDependentResources();
        CreateWindowSizeDependentResources();
        for(int i=0; i<3; i++)  my_camera[i] = new MyCamera(m_deviceResources);
    }
    
  4. CreateDeviceDependentResources() 関数で3体のモデルを生成します。
        // 両方のシェーダーの読み込みが完了したら、メッシュを作成します。
        auto createCubeTask = (createPSTask && createVSTask).then([this] () {
            m_CreateModel = new CreateModel(m_deviceResources);
            m_CreateModel->CreateCube(&m_vertexBuffer[0], &m_indexBuffer[0], &m_indexCount[0]);
            m_CreateModel->CreateCone(4, &m_vertexBuffer[1], &m_indexBuffer[1], &m_indexCount[1]);
            m_CreateModel->CreateCone(19, &m_vertexBuffer[2], &m_indexBuffer[2], &m_indexCount[2]);
        });
    
  5. Rotate() 関数では、モデル1の周りをモデル2が、モデル2の周りをモデル3が回転します。
    my_camera[1]->Model(m_rot, 1); は MyCamera Ver-1.2 に後から追加したモデルを回転する関数です。
    m_rot は3次元座標回転の配列で、1 や 2 は回転処理する個数です。
    例えば 2 のときは、m_rot[0] と m_rot[1] の回転を掛け合わせます。
    m_rot[] のパラメータ2(0.4f や 0.3f)は、回転半径になります。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        my_camera[0]->Model(0.0f, radians, 0.0f);
        float3 m_rot[] = {{ 0.0f, 0.4f, 0-radians },{ 0.0f, 0.3f, 0-radians }};
        my_camera[1]->Model(m_rot, 1);
        my_camera[2]->Model(m_rot, 2);
    }
    
  6. Render() 関数ではモデル1に続いてモデル2, モデル3を描画します。
    void Sample3DSceneRenderer::Render()
    {
        if (!m_loadingComplete) {  return;  }
    
        auto context = m_deviceResources->GetD3DDeviceContext();
        context->VSSetShader(m_vertexShader.Get(), nullptr, 0);
        context->PSSetShader(m_pixelShader.Get(), nullptr, 0);
    
        context->VSSetConstantBuffers(
            0, 1, m_constantBuffer.GetAddressOf());
    
        context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
        context->IASetInputLayout(m_inputLayout.Get());
    
        UINT stride = sizeof(VertexPositionColor);
        UINT offset = 0;
    
        //☆モデルを描画
        for(int i=0; i<3; i++)
        {   m_constantBufferData.projection = my_camera[i]->m_projection;
            m_constantBufferData.view = my_camera[i]->m_view;
            m_constantBufferData.model = my_camera[i]->m_model;
    
            context->UpdateSubresource(
                m_constantBuffer.Get(), 0, NULL, &m_constantBufferData, 0, 0);
            context->IASetVertexBuffers(
                0, 1, m_vertexBuffer[i].GetAddressOf(), &stride, &offset);
            context->IASetIndexBuffer(
                m_indexBuffer[i].Get(), DXGI_FORMAT_R16_UINT, 0);
    
            context->DrawIndexed(m_indexCount[i], 0, 0);
        }
    }
    
  7. 3体のモデルが親子孫の関係で回転します。

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