Win10 MouseRot

Windows10 Direct3D でモデルを Mouse で回転します。

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

プロジェクトの作成

  1. DirectX 11 および XAML アプリ(ユニバーサル Windows)には、最初から PointerEvent のハンドラが組み込まれていてマウスの操作でY軸を中心に回転します。
    Visual Studio 2015 を起動して Win10 Template を参照して「XAML アプリ(ユニバーサル Windows)」を構築して下さい。
    コンパイルして実行するとカラーキューブが回転し、FPS と TextBox に XAML! が表示されます。
    マウスの左ボタンを押しながら横方向にドラッグして下さい。
    マウスの座標に合わせてY軸を中心に回転します。
  2. Y軸だけでなく、X軸でも回転するようにプログラムを修正します。
    DirectXPage.xaml.cpp には Pointer の EventHandler が設定されています。
    OnPointerMoved() で X と Y を渡して下さい。
    void DirectXPage::OnPointerMoved(Object^ sender, PointerEventArgs^ e)
    {   if (m_main->IsTracking())
        {   m_main->TrackingUpdate(e->CurrentPoint->Position.X, e->CurrentPoint->Position.Y);
        }
    }
    
  3. App1Main.h に m_pointerLocationX が定義されているので、m_pointerLocationY を追加して下さい。
        float m_pointerLocationX;
        float m_pointerLocationY;
    
  4. App1Main.h の TrackingUpdate() 関数で positionX と positionY を保存します。
        void TrackingUpdate(float positionX, float positionY)
        {   m_pointerLocationX = positionX;
            m_pointerLocationY = positionY;
        }
    
  5. App1Main.cpp の ProcessInput() 関数を修正します。
    void App1Main::ProcessInput()
    {   m_sceneRenderer->TrackingUpdate(m_pointerLocationX, m_pointerLocationY);
    }
    
  6. Content\ に格納されている Class Sample3DSceneRenderer で座標を受け取ります。
    Sample3DSceneRenderer.h の TrackingUpdate() 関数の宣言を修正します。
        void TrackingUpdate(float positionX, float positionY);
    
  7. Sample3DSceneRenderer.cpp を修正してY軸とX軸で回転します。
    モデルの回転は Win10 Rotate を参照して下さい。
    void Sample3DSceneRenderer::TrackingUpdate(float positionX, float positionY)
    {
        XMMATRIX    mat;
        XMFLOAT4X4  f4x4;
        float       rx, ry;
    
        if (m_tracking)
        {   rx = XM_2PI*2.0f*positionX/m_deviceResources->GetOutputSize().Width;
            ry = XM_2PI*2.0f*positionY/m_deviceResources->GetOutputSize().Height;
            mat = XMMatrixRotationY(rx) * XMMatrixRotationX(ry);
            XMStoreFloat4x4(&f4x4, mat);
            m_constantBufferData.model = f4x4;
        }
    }
    
  8. Mouse(PointerEvent) の基礎は C++ のページから Win10 Mouse を参照して下さい。
    Direct2D の Mouse(PointerEvent) は Mouse Image を参照して下さい。
    リンク出来ない時は私のトップページからたどって下さい。
    PointerEvent 関係の API は仕様が固まっておらず、バージョンが変わると動かなくなるかも知れません。
    このプロジェクトは 2016/03/02 Windows10 & Visual Studio Community 2015 の環境で開発しました。

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