我有一个多点触控WPF应用程序,我想在其中旋转一些东西。 ManipulationDelta
的问题,ManipulationOrigin
总是两个手指之间的中心,但我想用固定的手指移动手指。
示例: Finger1 固定在屏幕上, Finger2 绕过它,需要在 Finger1 点旋转中心。然后 Finger2 固定并且 Finger1 四处转动 - 现在以 Finger2 点为中心旋转。所有这些都是在ManipulationStarted
和ManipulationCompleted
的一个会话之间完成的,因为手指始终在屏幕上。
现在我正在尝试计算旧位置和新位置之间的向量,并围绕手指旋转,这个位置变化最小。它有效,但不是很好。
任何想法如何以更好的方式在每个时刻获得正确的旋转点?
UPD: MSDN示例问题(Clemens的代码) - Finger1下的矩形改变它的位置,而Finger1是固定的。
手指1和手指2固定在屏幕上。
Finger2在Finger1周围旋转
UPD2:
如果我围绕e.Menipulators.First().GetPosition(RotatingControl)
进行轮换,一切都会好的。问题,手指可以改变,我需要知道现在哪个手指在移动。这不是一个难题。但有时两个手指都会旋转 - 在这种情况下,旋转应该发生在ManipulationOrigin
答案 0 :(得分: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°。显然总旋转为零,但物体已移动。