2012-10-16 108 views
0

我有一個多點觸控WPF應用程序,我想旋轉一些東西。 ManipulationDelta的問題,ManipulationOrigin始終是2個手指之間的中心,但我想用移動的手指圍繞固定的手指旋轉。更改旋轉手指上的旋轉點已更改

實施例:Finger1固定在屏幕上並Finger2繞到它,與旋轉中心在所需Finger1點。然後手指2固定和手指1四處走動 - 現在輪轉中心在手指2點。所有這些都是在ManipulationStartedManipulationCompleted之間的一個會話之間完成的,因爲手指總是在屏幕上。

現在我試圖計算舊位置和新位置之間的矢量,並圍繞手指旋轉,哪個位置改變爲最小。它有效,但不是很好。

任何想法如何以更好的方式在每個時刻獲得正確的旋轉點?

UPD: 問題MSDN示例(克萊門斯代碼) - 在Finger1下的矩形改變它的位置,而Finger1被修復。

Finger1和Finger2在固定屏幕上。 Two finger on screen

Finger2左右旋轉Finger1 Finger2 rotated around FInger1

UPD2: 如果我做左右旋轉e.Menipulators.First().GetPosition(RotatingControl)一切正常。問題是,手指可以改變,我需要知道現在哪個手指正在移動。這不是一個難題。但有時兩個手指會旋轉 - 在這種情況下,旋轉應該發生在ManipulationOrigin

+0

這應該如何工作,例如,如果用戶開始使用Finger1固定並執行部分旋轉移動Finger2,然後修復Finger2並移動Finger1?旋轉點是否應該在每次操作時固定一次或者應該是動態的? –

+0

它應根據當前旋轉的手指動態更改。 – igofed

回答

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°。顯然總旋轉爲零,但物體已移動。

+0

我在MSDN上閱讀這個例子。這裏的問題是矩形圍繞着ManipulationOrigin旋轉,這不是真正的旋轉中心。操作原點是2個手指之間的中心,所以當您修復Finger1並且不僅在Finger2下而且在Finger1下旋轉Finger2矩形更改位置時。我用picure的例子更新了問題。 – igofed

+0

我已經理解你的問題。我想說的是,如果你不僅旋轉,而且還*翻譯*,你只能達到預期的行爲。 – Clemens

+0

我更新了問題。我可以在沒有翻譯的情況下旋轉,但是在每個DeltaManipulation中,我都應該計算右手指,並且存在一些問題。 – igofed