Mouse Rotation

Camera と LonLatController を組み込んでマウスの操作で回転します。

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

Camera を使う

  1. Basic Loader をベースにして、Camera と LonLatController を組み込みます。
    LonLatController を組み込むと、マウスやキーの操作で簡単にカメラを回転することが出来ます。
  2. ベースのプロジェクトに次のファイルを加えて下さい。
    これらのファイルは Direct3D resource loading sample から取得することが出来ます。
    ファイル名 説明
    BasicCamera.cpp BasicCamera プログラムファイル
    BasicCamera.h BasicCamera ヘッダーファイル
    LonLatController.cpp LonLatController プログラムファイル
    LonLatController.h LonLatController ヘッダーファイル
  3. Model.h に Camera と LonLatController の領域を定義します。
    ViewProjection も Camera に合わせて float4x4 に書き換えます。
    #include "BasicCamera.h"
    #include "BasicMath.h"
    #include "LonLatController.h"
    
    struct ViewProjection
    {
        float4x4 model;
        float4x4 view;
        float4x4 projection;
    };
    
    private:
        BasicCamera^        m_camera;
        LonLatController^   m_controller;
    
  4. Model.cpp を Camera に合わせて追加/修正します。
    CreateDeviceResources() 関数で Camera を生成します。
    void Model::CreateDeviceResources()
    {
        ・・・
        m_camera = ref new BasicCamera();
    }
    
    CreateWindowSizeDependentResources() 関数で Projection を初期化します。
    void Model::CreateWindowSizeDependentResources()
    {
        Direct3DBase::CreateWindowSizeDependentResources();
        m_camera->SetProjectionParameters(
            70.0f,
            m_renderTargetSize.Width / m_renderTargetSize.Height,
            0.01f, 100.0f );
        m_camera->GetProjectionMatrix(&m_constantBufferData.projection);
    }
    
    Update() 関数で Camera を更新します。
    void Model::Update(float timeTotal, float timeDelta)
    {
        m_constantBufferData.model = rotationY(-timeTotal * 60.0f);
        m_camera->SetViewParameters(
            float3(0, 1.0f, 4.0f),
            float3(0, 0, 0),
            float3(0, 1, 0) );
        m_camera->GetViewMatrix(&m_constantBufferData.view);
        m_d3dContext->UpdateSubresource(
            m_constantBuffer.Get(),
            0, nullptr, &m_constantBufferData, 0, 0 );
    }
    
  5. この状態で Basic Loader と同様に地球儀が回転しながら描画されることを確認して下さい。

Mouse で回転

  1. LonLatController を組み込んで、マウスやキーの操作でカメラを回転します。
    Direct3DApp1.cpp(.h) から PointerPressed や PointerMoved のイベントハンドラ関係のソースを削除します。
    これらの機能は LonLatController の Initialize() 関数に組み込まれています。
  2. Model.cpp の修正です。
    CreateDeviceResources() 関数で Camera と LonLatController を生成します。
    SetPosition() は最初のカメラの座標です。
    void Model::CreateDeviceResources()
    {
        ・・・
        m_camera = ref new BasicCamera();
        m_controller = ref new LonLatController();
        m_controller->Initialize(m_window.Get());
        m_controller->SetPosition(float3(0, 1.0f, 4.0f));
    } 
    
    Update() 関数で Camera の座標を更新します。
    get_Position() がマウスで操作されたカメラの座標です。
    get_LookPoint() のリターン値は float3(0, 0, 0); に固定されています。
    void Model::Update(float timeTotal, float timeDelta)
    {
        m_controller->Update();
        m_camera->SetViewParameters(
            m_controller->get_Position(),
            m_controller->get_LookPoint(),
            float3(0, 1, 0) );
        m_camera->GetViewMatrix(&m_constantBufferData.view);
        m_d3dContext->UpdateSubresource(
            m_constantBuffer.Get(),
            0, nullptr, &m_constantBufferData, 0, 0 );
    }
    
  3. プログラムをコンパイル&実行してみて下さい。
    マウスの操作でカメラが回転します。
    また A, D, X, SP キーでもカメラが回転するので確かめて下さい。
    さらに S, W キーでズームイン/ズームアウトが出来ます。
  4. DirectX9 でも マウス操作でView座標を回転する を掲載しています。
    DirectX10 でも ティーポットを Camera で操作 を掲載しています。

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