12.Update系の操作

1202.イージング

 このサンプルはFullSample202というディレクトリに含まれます。
 BaseCrossDx11.slnというソリューションを開くとDx11版が起動します。
 BaseCrossDx12.slnというソリューションを開くとDx12版が起動します。

 実行結果は以下のような画面が出ます。

 

図1202a

 

 中心の壁模様のボックスが、移動しながら回転するのがわかると思います。

イージングとは

 イージングとは、補間処理のことです。オブジェクトを移動したり回転したり、あるいは拡大縮小するときに、一定のスピードで変化するばかりでは、面白くありません。
 BaseCross64には、この、イージング処理が、ライブラリ化されています。

Easingテンプレートクラス

 イージングを実装するには、Easingテンプレートクラスを実装します。
 Character.cppにあります、MoveBoxクラスに実装されてます。
 MoveBox::OnUpdate()関数を見てください。
void MoveBox::OnUpdate() {
    float ElapsedTime = App::GetApp()->GetElapsedTime();
    m_TotalTime += ElapsedTime;
    if (m_TotalTime >= 4.0f) {
        m_TotalTime = 0.0f;
        m_Swap = 1 - m_Swap;
    }
    auto PtrTrans = GetComponent<Transform>();
    auto StartPos = PtrTrans->GetPosition();
    StartPos.x = m_Position.x;
    auto EndPos = StartPos;
    EndPos.x += 4.0f;
    Vec3 StartRot(0, 0, 0);
    Vec3 EndRot(0, XM_2PI * 2.0f, 0);
    Vec3 TgtPos,TgtRot;
    Easing<Vec3> easing;
    if (m_Swap) {
        TgtPos = easing.EaseInOut(EasingType::Exponential, EndPos, StartPos, m_TotalTime, 4.0f);
        TgtRot = easing.EaseInOut(EasingType::Exponential, EndRot, StartRot, m_TotalTime, 4.0f);
    }
    else {
        TgtPos = easing.EaseInOut(EasingType::Exponential, StartPos, EndPos, m_TotalTime, 4.0f);
        TgtRot = easing.EaseInOut(EasingType::Exponential, StartRot, EndRot, m_TotalTime, 4.0f);
    }
    PtrTrans->SetRotation(TgtRot);
    PtrTrans->SetPosition(TgtPos);
}
 赤くなっているところがポイントの部分です。
 Easingテンプレートクラステンプレートなので、イージング処理をしたい型で構築します。
    Easing<Vec3> easing;
 こんな感じです。もしfloat型で構築したい場合は
    Easing<float> easing;
 のようにします。
 EasingテンプレートクラスにはEasiIn()、EasiOut()、そして、EasiInOut()関数があります。ここではEasiInOut()関数を使っています。
 ここで実装している行動処理はEasiInOut()で移動と回転です。
 行き返りを実装しています。この処理は最初はゆっくり、途中は速く、最後はゆっくりという処理です。
 EasingType::Exponentialというのは、イージング方法です。主にイージングの速くなるまでのパラメータや速くなった時のスピードとかを変えられます。
 このパラメータはQuadratic, Cubic, Quartic, Quintic, Sinusoidal, Exponential, Circularがあります。
 ここで使っているのはExponentialです。