X-FILE を親子で回転する

2体のカラーモデルを XFILE から入力して親子関係で回転します。

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

プログラムの説明

  1. Windows10 で2体のカラーモデルを XFILE から入力して親子関係で回転します。
    Win10 Men4 2Model を参照して「モデル1の周りをモデル2が回転」するプロジェクトを作成して下さい。
    このプロジェクトは Class CreateColor を組み込んで2体のモデルを親子関係で回転しています。
    「頂点+カラー」のモデルを描画するプロジェクトなのでシェーダー関係はそのまま使えます。
    基本的な修正は CreateColor Class を Load_X Class に置き換えるだけです。
    プロジェクトから CreateColor.h(.cpp) を削除して Load_X.h(.cpp) を追加して下さい。
    Load_X.h(.cpp) は Load_X Color に掲載されています。
  2. X-FILE をロードするために次のファイルをプロジェクトの Content\ に加えて下さい。
    BasicReaderWriter は Windows10 DirectX Library を参照して下さい。
    ファイル 説明
    Content\BasicMath.h DirectX の基本データ宣言
    Content\BasicReaderWriter.h DirectX 基本入出力の Header File
    Content\BasicReaderWriter.cpp DirectX 基本入出力の Program File
  3. 描画する2体の X-FILE("CubeColor.x", "Ball.x")をプロジェクトに加えます。
    カラーが設定されていれば、モデル(X-FILE)は問わないので適当なものを調達してきて下さい。
    但し、X-FILE の仕様は多種多様で適合しない場合もあるので注意して下さい。
    X-FILE を右クリックしてコンテンツを True に設定します。
  4. Sample3DSceneRenderer.h に Load_X.h を組み込んで、Load_X Class の領域を定義します。
    #include "Load_X.h"
    
        Load_X  *model;
    
  5. Sample3DSceneRenderer.cpp で CreateColor に代えて Load_X でモデルをロードします。
        // 両方のシェーダーの読み込みが完了したら、メッシュを作成します。
        auto createCubeTask = (createPSTask && createVSTask).then([this] () {
            model = new Load_X(m_deviceResources);
            model->Load("CubeColor.x", &m_vertexBuffer1, &m_indexBuffer1, &m_indexCount1);
            model->Load("Ball.x", &m_vertexBuffer2, &m_indexBuffer2, &m_indexCount2);
        });
    
        // モデルが読み込まれたら、オブジェクトを描画する準備が完了します。
        createCubeTask.then([this] () {
            m_loadingComplete = true;
        });
    }
    
  6. Render() 関数ではカリングを設定して描画します。
        // カリングを設定
        model->SetCullMode();
        // オブジェクトを描画します。
        context->DrawIndexed(m_indexCount1, 0, 0);
    
  7. 後はモデルサイズに合わせて座標を調整して下さい。
    私はカメラを引いて(10.0f)モデルを小さく描画しました。
    またモデル2の回転半径を大きく(10.0f)して回転しています。
    static const XMVECTORF32 eye = { 0.0f, 3.0f, 10.0f, 0.0f };
    void Sample3DSceneRenderer::Rotate(float radians)
    {   XMMATRIX    view, mat;
        XMStoreFloat4x4(&m_constantBufferData1.model, XMMatrixTranspose(XMMatrixRotationY(radians)));
        view = XMMatrixTranspose(XMMatrixLookAtRH(XMVECTORF32{ 0.0f, 0.0f, 10.0f, 0.0f },
            XMVECTORF32{ 0.0f, 0.0f, 0.0f, 0.0f }, XMVECTORF32{ 0.0f, 1.0f, 0.0f, 0.0f }));
        mat = XMMatrixRotationRollPitchYaw(0.8f, 0.0f, -radians);
        XMStoreFloat4x4(&m_constantBufferData2.model, mat * view);
    }
    

MyCamera を組み込む

  1. MyCamera.h と MyCamera.cpp をプロジェクトの Content に加えて下さい。
    MyCamera は Ver-1.2 を Page 検索から探して下さい。
  2. Sample3DSceneRenderer.h に MyCamera を定義します。
    #include "MyCamera.h"
        MyCamera        *camera1 = nullptr;
        MyCamera        *camera2 = nullptr;
    
  3. Constructer で MyCamera を生成します。
        camera1 = new MyCamera(m_deviceResources);
        camera2 = new MyCamera(m_deviceResources);
    
  4. CreateWindowSizeDependentResources() からは Projection() を呼ぶだけです。
    void Model::CreateWindowSizeDependentResources()
    {   if (camera1!=nullptr)   camera1->Projection();
        if (camera2!=nullptr)   camera2->Projection();
    }
    
  5. Rotate() で親子で回転するように設定します。
    8.0f が回転半径で、Z軸で回転するときは x に 1.0f を設定して下さい。
    void Sample3DSceneRenderer::Rotate(float radians)
    {
        camera1->Model(0.0f, radians, 0.0f);
        camera2->Model(8.0f, 1.0f, 0.0f, -radians);
    }
    
  6. Render() 関数でモデルを描画します。
    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->VSSetConstantBuffers1(0, 1, m_constantBuffer.GetAddressOf(), nullptr, nullptr);
    
        context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
        context->IASetInputLayout(m_inputLayout.Get());
        // カリングを設定
        model->SetCullMode();
    
        // 各頂点は、VertexPositionColor 構造体の 1 つのインスタンスです。
        UINT stride = sizeof(VertexPositionColor);
        UINT offset = 0;
    
        //☆モデル1を描画
        m_constantBufferData1.projection = camera1->m_projection;
        m_constantBufferData1.view = camera1->m_view;
        m_constantBufferData1.model = camera1->m_model;
    
        context->UpdateSubresource(
            m_constantBuffer.Get(), 0, NULL, &m_constantBufferData1, 0, 0);
        context->IASetVertexBuffers(
            0, 1, m_vertexBuffer1.GetAddressOf(), &stride, &offset);
        context->IASetIndexBuffer(
            m_indexBuffer1.Get(), DXGI_FORMAT_R16_UINT, 0);
    
        // オブジェクトを描画します。
        context->DrawIndexed(m_indexCount1, 0, 0);
    
        //☆モデル2を描画
        m_constantBufferData2.projection = camera2->m_projection;
        m_constantBufferData2.view = camera2->m_view;
        m_constantBufferData2.model = camera2->m_model;
    
        context = m_deviceResources->GetD3DDeviceContext();
        context->UpdateSubresource(
        m_constantBuffer.Get(), 0, NULL, &m_constantBufferData2, 0, 0);
        context->IASetVertexBuffers(
            0, 1, m_vertexBuffer2.GetAddressOf(), &stride, &offset);
        context->IASetIndexBuffer(
            m_indexBuffer2.Get(), DXGI_FORMAT_R16_UINT, 0);
    
        // オブジェクトを描画します。
        context->DrawIndexed(m_indexCount2, 0, 0);
    }
    

親・子・孫で回転します。
[Next Chapter ↓] Win10 Model3
[Next Chapter ↓] X-FILE を親子孫で回転する
[Previous Chapter ↑] Load_X Color

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