0

我有一个多点触控 WPF 应用程序,我想在其中旋转一些东西。的问题ManipulationDeltaManipulationOrigin始终是两根手指之间的中心,但我想用移动的手指围绕固定的手指旋转。

示例:Finger1固定在屏幕上,Finger2围绕它旋转,需要以Finger1点为中心旋转。然后Finger2固定,Finger1转动——现在以Finger2点为中心旋转。所有这些都是在一次ManipulationStarted和之间完成的ManipulationCompleted,因为手指总是在屏幕上。

现在我正在尝试计算旧位置和新位置之间的矢量,并围绕手指旋转,该位置变化最小。它有效,但不是很好。

任何想法如何以更好的方式在每一刻获得正确的旋转点?

UPD: MSDN 示例的问题(Clemens 的代码) - Finger1 下的矩形改变了它的位置,而 Finger1 已修复。

Finger1 和 Finger2 固定在屏幕上。 两根手指在屏幕上

Finger2 围绕 Finger1 旋转 手指 2 围绕手指 1 旋转

UPD2: 如果我旋转e.Menipulators.First().GetPosition(RotatingControl)一切都可以。问题,那个手指可以改变,我需要知道现在哪个手指在移动。这不是一个难题。但有时两个手指都会旋转——在这种情况下,旋转应该发生在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 回答