0

マルチタッチWPFアプリケーションがあり、その中のいくつかのものをローテーションしたいと思います。の問題はManipulationDeltaManipulationOrigin常に2本の指の間の中心ですが、固定された1本の指を中心に指を動かしながら回転させたいと思います。

例:Finger1が画面に固定され、Finger2がその周りを回転し、 Finger1ポイントの中心で回転する必要があります。次に、 Finger2が固定され、Finger1が回転します。Finger2ポイントを中心に回転します。指は常に画面上にあるため、これらすべての作業はManipulationStartedとの1つのセッションの間に行われます。ManipulationCompleted

今、私は古い位置と新しい位置の間のベクトルを計算し、指の周りを回転させようとしています。この位置は最小限に変更されました。それは機能しますが、あまりうまくいきません。

より良い方法であらゆる瞬間に正しい回転点を取得する方法はありますか?

UPD: MSDNの例の問題(クレメンスのコード)-Finger1の下の長方形は位置を変更しますが、Finger1は修正されました。

画面に固定されたFinger1とFinger2。 画面上の2本の指

Finger2がFinger1を中心に回転 Finger2がFINger1を中心に回転

UPD2: 私が回転をすればe.Menipulators.First().GetPosition(RotatingControl)すべてがOKです。問題、その指は変更できるので、現在どの指が動いているかを知る必要があります。それは難しい問題ではありません。しかし、時々両方の指が回転します-そのような場合、回転は周りで発生するはずですManipulationOrigin

4

1 に答える 1

1

によって提供される値でオブジェクトを変換する場合、ManipulationDeltaEventArgs通常は変換行列を更新します。これは、以下に示すように、RenderTransformとして使用されるMatrixTransformのMatrixプロパティである可能性があります。

<Rectangle ...>
    <Rectangle.RenderTransform>
        <MatrixTransform x:Name="transform"/>
    </Rectangle.RenderTransform>
</Rectangle>

このマトリックスは、次のようなManipulationDeltaイベントハンドラーの平行移動、回転、スケーリングのデルタ値に従って更新されます。

ManipulationDelta d = e.DeltaManipulation;
Matrix m = transform.Matrix;
m.Translate(d.Translation.X, d.Translation.Y);
m.RotateAt(d.Rotation, e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
m.ScaleAt(d.Scale.X, d.Scale.Y, e.ManipulationOrigin.X, e.ManipulationOrigin.Y);
transform.Matrix = m;

この変換は、回転するだけでなく、オブジェクトを移動およびスケーリングすることを除いて、固定および移動する指で完全に機能します。m.ScaleAt(...)指の間の距離があまり変化しない限り、呼び出しをドロップして、まだ希望に近い変換を取得する場合は、スケーリングを省略できます。

しかし、まだ動きはありますが、それはあなたが取り除くことができないものです。最初に指1を固定し、次に180°回転させてから、指2を固定し、再び180°回転させたとします。明らかに、総回転はゼロですが、オブジェクトは移動しています。

于 2012-10-16T19:16:12.830 に答える