DX2D BmpRot

DX2D Bitmap Rotate


IMAGE(画像)の回転と Sprite の切り分けです。

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

画像の回転

  1. DirectX Windows8 で LoadBitmapFIle() 関数を使って IMAGE(画像)を回転して描画します。
    DX2D Load Bitmap のプロジェクトを用意して下さい。
    この中で LoadBitmapFile() 関数が定義されています。
  2. Main.cpp の修正です。
    CreateDeviceResources() から LoadBitmapFile() を呼び出します。
    m_d2dContext, m_wicFactory は DirectXBase で定義されています。
    L"ayu.jpg", L"girl.gif" などの画像ファイルは、プロジェクトのフォルダに格納してプロジェクトに加えて下さい。
    ページ先頭の画像は騎士が回転していますが、プログラムでは「あゆの画像」を使っています。
    これもサーバーの容量制限に伴うメモリの節約です。 (^_^;)
    Microsoft::WRL::ComPtr<ID2D1Bitmap1>    m_bitmapPerspective;
    
    void Main::CreateDeviceResources()
    {
        DirectXBase::CreateDeviceResources();
        m_bitmapPerspective = LoadBitmapFile(m_d2dContext, m_wicFactory, L"ayu.jpg");
        //m_bitmapPerspective = LoadBitmapFile(m_d2dContext, m_wicFactory, L"girl.gif");
    }
    
  3. Render() 関数で画像を描画します。
    L"ayu.jpg" のサイズは、幅=280, 高さ=170 の大きさです。
    DrawBitmap() の 6番目のパラメータに変換行列(matrix) を設定します。
    RotationZ(90) でY軸を中心に90度回転します。
    以前はラジアン角が使われていたのですが、度数に変更されたようです。
    表示する座標(300, 300)は、変換行列の中で設定します。
    画像の左上を起点に回転するので、表示する座標を調整して下さい。
    二回目の回転は、Y軸を中心に200度回転しました。
    表示する座標(800, 600)は、回転に合わせて調整した値です。
    void Main::Render()
    {
        m_d2dContext->BeginDraw();
    
        m_d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));
    
        m_d2dContext->DrawBitmap(m_bitmapPerspective.Get());
    
        D2D1_RECT_F dest = D2D1::RectF(0, 0, 280, 170.0f);
        D2D1::Matrix4x4F matrix =
            D2D1::Matrix4x4F::RotationZ(90) *
            D2D1::Matrix4x4F::Translation(300, 300, 0);
        m_d2dContext->DrawBitmap(
            m_bitmapPerspective.Get(),
            &dest,
            1.0f,
            D2D1_INTERPOLATION_MODE_LINEAR,
            nullptr, // Use the full source bitmap for sampling.
            &matrix
            );
    
        D2D1::Matrix4x4F matrix2 =
            D2D1::Matrix4x4F::RotationZ(200) *
            D2D1::Matrix4x4F::Translation(800, 600, 0);
        m_d2dContext->DrawBitmap(
            m_bitmapPerspective.Get(),
            &dest,
            1.0f,
            D2D1_INTERPOLATION_MODE_LINEAR,
            nullptr,
            &matrix2
            );
    
        HRESULT hr = m_d2dContext->EndDraw();
        if (hr != D2DERR_RECREATE_TARGET)
        {
            DX::ThrowIfFailed(hr);
        }
    
        Present();
    }
    

画像の切り分け

  1. 次は DirectX Windows8 で、画像を Sprite に切り分けて描画します。
    テストに使った画像(Girl.gif)は、128*216 の Sprite が横に7枚並んでいます。
    void Main::CreateDeviceResources()
    {
        DirectXBase::CreateDeviceResources();
        //m_bitmapPerspective = LoadBitmapFile(m_d2dContext, m_wicFactory, L"ayu.jpg");
        m_bitmapPerspective = LoadBitmapFile(m_d2dContext, m_wicFactory, L"girl.gif");
    }
    
  2. Render() 関数で画像を切り分けて描画します。
    destRect が受け取り側(画面)の矩形で、souRect が送り側(画像)の矩形です。
    Girl.gif は、128*216 の Sprite が横に7枚並んでいます。
    destRect3 のように、受け取り側の矩形を縦に引き延ばして描画することも出来ます。
    void Main::Render()
    {
        m_d2dContext->BeginDraw();
    
        m_d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::CornflowerBlue));
    
        m_d2dContext->DrawBitmap(m_bitmapPerspective.Get());
    
        D2D1_RECT_F destRect = D2D1::RectF(100.0f, 300.0f, 228.0f, 516.0f);
        D2D1_RECT_F souRect = D2D1::RectF(0.0f, 0.0f, 128.0f, 216.0f);
        m_d2dContext->DrawBitmap(
            m_bitmapPerspective.Get(),
            &destRect,
            1.0f,
            D2D1_INTERPOLATION_MODE_LINEAR,
            &souRect
            );
    
        D2D1_RECT_F destRect2 = D2D1::RectF(300.0f, 300.0f, 428.0f, 516.0f);
        D2D1_RECT_F souRect2 = D2D1::RectF(128.0f, 0.0f, 256.0f, 216.0f);
        m_d2dContext->DrawBitmap(
            m_bitmapPerspective.Get(),
            &destRect2,
            1.0f,
            D2D1_INTERPOLATION_MODE_LINEAR,
            &souRect2
            );
    
        D2D1_RECT_F destRect3 = D2D1::RectF(500.0f, 300.0f, 628.0f, 600.0f);
        D2D1_RECT_F souRect3 = D2D1::RectF(256.0f, 0.0f, 384.0f, 216.0f);
        m_d2dContext->DrawBitmap(
            m_bitmapPerspective.Get(),
            &destRect3,
            1.0f,
            D2D1_INTERPOLATION_MODE_LINEAR,
            &souRect3
            );
    
        HRESULT hr = m_d2dContext->EndDraw();
        if (hr != D2DERR_RECREATE_TARGET)
        {
            DX::ThrowIfFailed(hr);
        }
    
        Present();
    }
    

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