2016-11-30 5 views
0

저는 DirectX 및 Direct3D/2D 등을 처음 사용하고 있으며 현재 보유하고있는 기계에 대해 CAD 뷰어를 제작할지 여부에 대한 실험을 진행하고 있습니다.SharpDX에서 2D 카메라 패닝

여기에서 Direct2dOnWPF의 컨트롤을 사용하면 SharpDX를 사용하여 Direct2D를 WPF 창에 표시 할 수 있습니다.

현재 컨트롤이 작동 중이며 파일을로드하고 그림을 표시합니다.

나는 이제 카메라를 만들었으며 (정도까지) 확대/축소를 구현했지만 문제점은 이동 중입니다. 문제는 패닝 할 때 드로잉이 마우스로 움직일 것으로 기대하지만 그렇게하지 않는다는 것입니다. 작은 움직임이 있지만 움직임이 커지면 그림이 마우스 움직임을 넘어 움직입니다. 마치 한 번의 움직임으로 마우스를 움직이면 움직이는 속도가 빨라집니다.

일부 코드는 Direct2DControl이 Image 컨트롤을 기반으로하므로 마우스 이벤트 등에 액세스 할 수 있습니다. 여기에는 마우스 이벤트 및 타이머가있는 컨트롤의 일부 코드가 있습니다. 마우스가 멈췄을 때 멈추지 않을 것임을 알았을 때 마우스가 멈 추면 타이머를 감지했습니다.

// Timer to detect mouse stop 
private Timer tmr; 

public Direct2dControl() 
    { 
     // 
     // .... Init stuff 
     // 

     // Mouse panning 

     // get mouse position 
     MouseOrigin = CurrentMousePosition = new Point(0, 0); 

     tmr = new Timer { Interval = 50 }; 
     tmr.Elapsed += Tmr_Elapsed; 
    } 

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     base.OnMouseLeftButtonDown(e); 

     if (!DragIsOn) 
     { 
      DragIsOn = true; 
     } 
    } 

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) 
    { 
     base.OnMouseLeftButtonUp(e); 

     if (DragIsOn) 
     { 
      DragIsOn = false; 
      DragStarted = false; 
      MouseOrigin = CurrentMousePosition = e.GetPosition(this); 
     } 
    } 

    protected override void OnMouseMove(MouseEventArgs e) 
    { 
     base.OnMouseMove(e); 

     if (!DragIsOn) return; 

     MouseMoved = true; 

     if (!DragStarted) 
     { 
      DragStarted = true; 
      MouseOrigin = CurrentMousePosition = e.GetPosition(this); 

      tmr.Start(); 
     } 
     else 
     { 
      CurrentMousePosition = e.GetPosition(this); 

      var x = (float)(MouseOrigin.X - CurrentMousePosition.X); 
      var y = (float) (MouseOrigin.Y - CurrentMousePosition.Y); 

      cam.MoveCamera(cam.ScreenToWorld(new Vector2(x, y))); 

      tmr.Stop(); 
      tmr.Start(); 
     } 
    } 

private void Tmr_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     MouseOrigin = CurrentMousePosition; 

     tmr.Stop(); 
     MouseMoved = false; 
    } 

카메라 위치에서 이동하여 패닝 할 수 있습니다.

public void MoveCamera(Vector2 cameraMovement) 
    { 
     Vector2 newPosition = Position + cameraMovement; 

     Position = newPosition; 
    } 

    public Matrix3x2 GetTransform3x2() 
    { 
     return TransformMatrix3x2; 
    } 

    private Matrix3x2 TransformMatrix3x2 
    { 
     get 
     { 
      return 
       Matrix3x2.Translation(new Vector2(-Position.X, -Position.Y)) * 
       Matrix3x2.Rotation(Rotation) * 
       Matrix3x2.Scaling(Zoom) * 
       Matrix3x2.Translation(new Vector2(Bounds.Width * 0.5f, Bounds.Height * 0.5f)); 
     } 
    } 

마지막의 시작

의 I는 렌더 타겟 난 당신이 잘못된 좌표를 계산하고 생각

target.Transform = cam.GetTransform3x2(); 

답변

0

변환 업데이트 렌더링을 시작합니다. 첫째, 당신은 OnLeftMouseButtonDown에서 MouseOrigin 변수를 설정해야하고 다른 방법을 수정하지 않는 :

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
{ 
    base.OnMouseLeftButtonDown(e); 

    if (!DragIsOn) 
    { 
     DragIsOn = true; 
     MouseOrigin = e.GetPosition(this); 

     // I don't know the type of your cam variable so the following is pseudo code 
     MouseOrigin.x -= cam.CurrentPosition.x; 
     MouseOrigin.y -= cam.CurrentPosition.y; 
    } 
} 

그리고 다음과 같이 13. OnMouseMove에서는 수정합니다 DragStarted 및 CurrentMousePosition 변수가 필요하지 않은

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    base.OnMouseMove(e); 

    if (!DragIsOn) return; 

    MouseMoved = true; 

    var x = (float)(e.GetPosition(this).x - MouseOrigin.X); 
    var y = (float) (e.GetPosition(this).y - MouseOrigin.Y); 

    cam.MoveCamera(cam.ScreenToWorld(new Vector2(x, y))); 

    tmr.Stop(); 
    tmr.Start(); 

} 

.

작동하는지 알려주세요.

+0

감사합니다. 이동 속도는 이제 올바르게 보이지만 지금은 이동 방향에 문제가있는 것 같습니다. 중심에서 오른쪽 아래로 클릭하고 끌면 개체가 왼쪽 상단으로 이동합니다. 그런 다음 마우스를 멈추고 클릭 한 다음 마우스를 위로 움직이면 객체는 원래 경로에서 왼쪽 상단으로 계속 이동하지만 아래로 이동합니다. 그런 다음 중지하고 클릭 한 다음 화면 위로 왼쪽으로 이동하면 개체가 왼쪽 상단으로 돌아갑니다. – Gaz83

+0

'cam' 변수의 유형은 무엇입니까? – user1610015

+0

오, 타입 캠은 내 카메라 클래스입니다. – Gaz83