2012-10-16 6 views
0

저는 멀티 터치 WPF 응용 프로그램을 가지고 있으며 그 중 일부 회전을하고 싶습니다. ManipulationDelta의 문제인 ManipulationOrigin은 항상 두 손가락 사이의 중심이지만 고정 된 손가락 주위로 움직이는 손가락으로 회전하고 싶습니다.회전 손가락의 회전 지점 변경 변경

예 : Finger1 화면에 고정 Finger2 필요 Finger1 지점에서 중심으로 그 주위에 회전을 진행한다. 그러면 손가락 2가 고정되고 손가락 1이 돌아갑니다. 이제 센터가있는 회전이 손가락 2 포인트가됩니다. 모든 것들은 손가락이 항상 화면에 있기 때문에 ManipulationStartedManipulationCompleted의 한 세션 사이에서 이루어집니다.

이제 이전 위치와 새 위치 사이의 벡터를 계산하고 손가락 주위를 회전하려고합니다.이 위치는 최소로 변경되었습니다. 그것은 잘 작동하지만, 잘 작동하지 않습니다.

더 좋은 방법으로 매 순간 올바른 회전 지점을 얻는 방법에 대한 아이디어가 있습니까?

UPD : MSDN 예 (클레멘스의 코드)의 문제 - Finger1 고정하면서 Finger1 아래 사각형, 그 위치의 변화.

화면에 고정 된 손가락 1과 손가락 2. Two finger on screen

이 Finger2이

Finger1 Finger2 rotated around FInger1

중심으로 회전 UPD2 : 나는 회전을 할 경우 주위 e.Menipulators.First().GetPosition(RotatingControl) 모든 것이 OK입니다 . 문제는 그 손가락이 바뀔 수 있고 지금 어떤 손가락이 움직이고 있는지를 알아야합니다. 어려운 문제는 아닙니다. 하지만 때로는 두 손가락이 회전하는 경우가 있습니다.이 경우 회전이 발생해야합니다.

+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이지만 개체가 이동했습니다.

+0

이 예제는 MSDN에서 읽었습니다. 여기서 문제는 사각형이 실제 회전 중심이 아닌 ManipulationOrigin을 중심으로 회전한다는 것입니다. 조작 원점은 두 손가락 사이의 중심이므로 Finger1을 수정하고 Finger2 직사각형 위치를 Finger2 아래뿐만 아니라 Finger1 아래로 회전 할 때도 마찬가지입니다. 나는 picure 예제로 질문을 업데이트했다. – igofed

+0

나는 당신의 문제를 이해했습니다. 내가 말하고자하는 것은 회전뿐만 아니라 * 번역도 원하는 행동을 얻을 수 있다는 것입니다. – Clemens

+0

질문이 업데이트되었습니다. 나는 번역없이 바로 회전 할 수 있지만 모든 DeltaManipulation에서 오른쪽 손가락을 계산해야하고 거기에 몇 가지 문제가 있습니다. – igofed