Lesson3

Lesson3 立方体

立方体を回転しながら描画します。

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

プログラムの説明

  1. 立方体を回転しながら描画します。
    Main.cpp をダブルクリックして、ソースコードを表示して下さい。
    頂点データの構造体定義です。
    頂点データは三次元座標と色で構成されています。
        struct SimpleCubeVertex
        {
            float3 pos;   // position
            float3 color; // color
        };
        
  2. Model と View と Projection の変換マトリックスの形式定義です。
       
        struct ConstantBuffer
        {
            float4x4 model;
            float4x4 view;
            float4x4 projection;
        };
        
  3. 立方体の座標定義です。
    SimpleCubeVertex 構造体を使って、8個の頂点座標と頂点の色を定義しています。
        SimpleCubeVertex cubeVertices[] =
        {
            { float3(-0.5f, 0.5f, -0.5f), float3(0.0f, 1.0f, 0.0f) }, // +Y (top face)
            { float3( 0.5f, 0.5f, -0.5f), float3(1.0f, 1.0f, 0.0f) },
            { float3( 0.5f, 0.5f,  0.5f), float3(1.0f, 1.0f, 1.0f) },
            { float3(-0.5f, 0.5f,  0.5f), float3(0.0f, 1.0f, 1.0f) },
    
            { float3(-0.5f, -0.5f,  0.5f), float3(0.0f, 0.0f, 1.0f) }, // -Y (bottom face)
            { float3( 0.5f, -0.5f,  0.5f), float3(1.0f, 0.0f, 1.0f) },
            { float3( 0.5f, -0.5f, -0.5f), float3(1.0f, 0.0f, 0.0f) },
            { float3(-0.5f, -0.5f, -0.5f), float3(0.0f, 0.0f, 0.0f) },
        };
        
  4. 頂点データを組み合わせて、三角形ポリゴンで立方体のモデルを定義します。
    立方体の各面は、二個の三角形ポリゴンで構成します。
        unsigned short cubeIndices[] =
        {
            0, 1, 2,
            0, 2, 3,
    
            4, 5, 6,
            4, 6, 7,
    
            3, 2, 5,
            3, 5, 4,
    
            2, 1, 6,
            2, 6, 5,
    
            1, 7, 6,
            1, 0, 7,
    
            0, 3, 4,
            0, 4, 7
        };
        
  5. Run() メソッドのレンダリングループ while(true){...} で、モデルを回転しながら描画しています。
        while(true)
        {
            // Process events incoming to the window.
            m_window->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
    
            // Update the constant buffer to rotate the cube model.
            m_constantBufferData.model = rotationY(-degree);
            degree += 1.0f;
    
                ・・・
    
            // Draw the cube.
            m_d3dDeviceContext->DrawIndexed(
                ARRAYSIZE(cubeIndices),
                0,
                0
                );
    
            // Present the rendered image to the window.  Because the maximum frame latency is set to 1,
            // the render loop will generally be throttled to the screen refresh rate, typically around
            // 60Hz, by sleeping the application on Present until the screen is refreshed.
            DX::ThrowIfFailed(
                m_swapChain->Present(1, 0)
                );
        }
        
  6. カメラを引くとモデルが小さくなるのですが、float4x4 の変換行列で定義されています。
    そのままでは設定が難しいので eye, look, up に分けて、プログラムで view 変換マトリックスを計算します。
    【修正前】
        m_constantBufferData.view = float4x4(
            -1.00000000f, 0.00000000f,  0.00000000f,  0.00000000f,
             0.00000000f, 0.89442718f,  0.44721359f,  0.00000000f,
             0.00000000f, 0.44721359f, -0.89442718f, -2.23606800f,
             0.00000000f, 0.00000000f,  0.00000000f,  1.00000000f
            );
        
    【修正後】
        float3 eye = float3(0, 1.0f, 2.0f); // the position of the camera
        //float3 eye = float3(0, 1.0f, 4.0f); // the position of the camera
        float3 look = float3(0, 0, 0);      // the point the camera should look at
        float3 up = float3(0, 1, 0);        // the durection vector for up
    
        look = normalize(look - eye);
        float3 zAxis = -look;
        float3 xAxis = normalize(cross(up, zAxis));
        float3 yAxis = cross(zAxis, xAxis);
        float xOffset = -dot(xAxis, eye);
        float yOffset = -dot(yAxis, eye);
        float zOffset = -dot(zAxis, eye);
        m_constantBufferData.view = float4x4(
            xAxis.x, xAxis.y, xAxis.z, xOffset,
            yAxis.x, yAxis.y, yAxis.z, yOffset,
            zAxis.x, zAxis.y, zAxis.z, zOffset,
            0.0f,    0.0f,    0.0f,    1.0f );
        
    eye がカメラの座標です。
    float3(0, 1.0f, 4.0f); に変更するとカメラが遠くなって、モデルが小さく描画されます。
  7. 立方体に代えて、四面体のモデルを描画してみましょう。
    四面体の4個の頂点座標を定義します。
        SimpleCubeVertex cubeVertices[] =
        {
            { float3(-0.5f, 0.0f,  0.5f), float3(0.0f, 0.0f, 1.0f) },
            { float3( 0.5f, 0.0f,  0.5f), float3(1.0f, 0.0f, 0.0f) },
            { float3( 0.0f, 0.8f,  0.2f), float3(1.0f, 1.0f, 1.0f) },
            { float3( 0.0f, 0.0f, -0.4f), float3(0.0f, 1.0f, 0.0f) }
        };
        
  8. 頂点データを組み合わせて、三角形ポリゴンで四面体のモデルを定義します。
    ポリゴンが裏向かないようにカリングモードを合わせます。
    カリングモードの説明は Windows Guid を参照して下さい。
        unsigned short cubeIndices[] =
        {
            2, 1, 0,
            2, 3, 1,
            0, 3, 2,
            3, 0, 1  
        };
        
  9. 四面体のモデルに合わせてカメラを設定します。
        float3 eye = float3(0, -0.3f, 1.5f); // the position of the camera
        float3 look = float3(0, 0.3, 0);     // the point the camera should look at
        float3 up = float3(0, 1, 0);         // the durection vector for up
        

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