次の方法で共有


高度な翻訳

次の図は、翻訳の 2 つの解釈を示しています。

最初にオブジェクトが回転せずに移動される単純な平行移動を示し、次に回転と共に移動する高度な平行移動を示す図

例 A では、単純な変換の例では、オブジェクトは回転せずに移動されます。 例 B では、オブジェクトの接触点の位置に応じて、変換中にオブジェクトが回転します。 「1 本指の回転」の説明に従って 1 本指の回転を有効にした場合は、複雑な翻訳を有効にすることができます。 次の図は、平行移動を実行するときの 1 本指回転のさまざまなコンポーネントを示しています。

1 本指の回転のコンポーネント (ピボットポイント、ピボットポイント、ピボットラディウス) を示す図

オブジェクトが移動されると、半径が再計算され、ピボット ポイントが移動されます。

次のコードは、複雑な翻訳を可能にする ManipulationDelta の実装でこれを行う方法の 1 つを示しています。

    //Apply transformation based on rotationDelta (in radians)
    FLOAT rads = 180.0f / 3.14159f;
    m_dObj->Rotate(rotationDelta*rads, x, y);

    // Apply translation based on scaleDelta
    m_dObj->Scale(scaleDelta);

    // Apply translation based on translationDelta
    m_dObj->Translate(translationDeltaX, translationDeltaY);

    // Set values for one finger rotations
    FLOAT fPivotRadius = (FLOAT)(m_dObj->get_Width() + m_dObj->get_Height())/8.0f;
    FLOAT fPivotPtX = m_dObj->get_CenterX();
    FLOAT fPivotPtY = m_dObj->get_CenterY();
        
    m_manip->put_PivotPointX(fPivotPtX);
    m_manip->put_PivotPointY(fPivotPtY);
    m_manip->put_PivotRadius(fPivotRadius);       
   

注意

オブジェクト変換は、ピボット ポイントと半径が計算される前に行われます。 この方法では、ユーザーがオブジェクトの移動中にオブジェクトに対して展開を実行すると、オブジェクトは正しく移動します。

 

操作