X2017 KeyRot

Blend for Visual Studio Community 2017 でモデルを Key で回転します。

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

プロジェクトの作成

  1. 今キーが押されていることは、ウインドウハンドル(m_window)を使って GetAsyncKeyState() で調べます。
    ウインドウハンドルは App.cpp の SetWindow() 関数で取得出来るのですが、キーを調べるのは Sample3DSceneRenderer の Update() 関数です。
    そこで Class App(window_1) から Class App1Main(window_2) を経由して Class Sample3DSceneRenderer(m_window) にハンドルを渡します。
  2. Visual Studio 2017 を起動して DirectX 11 アプリ(ユニバーサル Windows)を構築して下さい。
    テンプレートが表示されないときは Visual Studio 2017 DirectX を参照して下さい。
    コンパイル&実行するとカラーキューブが回転しながら描画され FPS が表示されます。
  3. App.h にウインドウハンドルを保存する領域を定義して、App.cpp の SetWindow() 関数で保存して下さい。
    private:
        Windows::UI::Core::CoreWindow^ window_1;
    
    void App::SetWindow(CoreWindow^ window)
    {   ・・・
        window_1 = window;
    }
    
  4. App.cpp の Load() 関数で App1Main を生成した後で window_1 を window_2 にコピーします。
    void App::Load(Platform::String^ entryPoint)
    {   if (m_main == nullptr)
        {   m_main = std::unique_ptr<App1Main>(new App1Main(m_deviceResources));
            m_main->window_2 = window_1;
        }
    }
    
  5. App1Main.h にウインドウハンドルの領域を定義して下さい。
    public:
        Windows::UI::Core::CoreWindow^ window_2;
    
  6. App1Main.cpp の Update() で Sample3DSceneRenderer の m_window にコピーします。
    void App1Main::Update() 
    {
        if (m_sceneRenderer->m_window == nullptr)
        {
            m_sceneRenderer->m_window = window_2;
        }
    
  7. Sample3DSceneRenderer.h に m_window の領域を定義して下さい。
    これで Sample3DSceneRenderer でキーを調べることが出来るようになります。
    public:
        Windows::UI::Core::CoreWindow^ m_window;
    
    Sample3DSceneRenderer.h に回転情報を格納する RotY を定義して下さい。
        float   RotY = 0;
    
  8. Sample3DSceneRenderer.cpp の Update() 関数で今キーが押されているかを調べます。
    void Sample3DSceneRenderer::Update(DX::StepTimer const& timer)
    {
        if (!m_tracking)
        {
            Windows::UI::Core::CoreVirtualKeyStates KeyState;
            KeyState = m_window->GetAsyncKeyState(Windows::System::VirtualKey::Left);
            if (bool(KeyState & Windows::UI::Core::CoreVirtualKeyStates::Down))
            {   RotY -= 0.1f;
                if (RotY<XM_2PI)    RotY += XM_2PI;
            }
            KeyState = m_window->GetAsyncKeyState(Windows::System::VirtualKey::Right);
            if (bool(KeyState & Windows::UI::Core::CoreVirtualKeyStates::Down))
            {   RotY += 0.1f;
                if (RotY>XM_2PI)    RotY -= XM_2PI;
            }
            Rotate(RotY);
        }
    }
    
  9. Rotate() 関数でモデルを回転して Render() 関数で描画するのですが、修正する必要はありません。
    プログラムを実行するとモデルが自動回転しなくなり、「左矢印キー」または「右矢印キー」を押すとモデルが回転します。
    今回はY軸を中心に回転するだけですが、X軸の回転も追加してみて下さい。
  10. Win10 KeyRot では Constructor を通じてハンドルをリレーしています。
    マウスのモデルの回転は Win10 MouseRot を参照して下さい。
    OnKeyDown の簡単なプロジェクトは[超初心者のプログラム入門(C/C++)]から[VC-2017 Key Count]を参照して下さい。
    OnKeyDown, OnKeyUp で回転するプロジェクトは Win10 Model & Camera を参照して下さい。
【メモ】
Sample3DSceneRenderer::Update() 関数の m_tracking は、マウスで操作するときのフラグです。
DirectX 11 および XAML アプリ(ユニバーサル Windows) を使ったときに設定されるのですが、今回は false のままです。

ハンドルのリレーがうまく出来ず nullptr でこけるので、デバッグしたときのソースコードです。
    if (m_window == nullptr)    OutputDebugString(L"m_window : nullptr\n");
    else   OutputDebugString(L"m_window : OK\n");

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