2016-11-30 59 views
0

平移我是新來的DirectX和Direct3D/2D等,只是當前運行是否繼續製作一臺機器,我們有一個CAD瀏覽器的實驗。2D相機在SharpDX

我使用從這裏Direct2dOnWPF控制,使我使用SharpDX顯示的Direct2D到WPF窗口。

目前我有控制的工作及其負載文件並顯示圖。

我現在已經創建了一個攝像頭和我已經實現縮放(在一定程度上),但我的問題是與平移。問題是,當平移時,我希望繪圖隨鼠標移動,但不是。小的運動有點類似,但更大的運動會導致繪圖移動到鼠標移動之外。幾乎就像我將鼠標移動到一個單一的移動中一樣,它移動得越快。

好一些代碼,所述Direct2DControl是基於圖像控制,所以我有機會獲得鼠標事件等。這裏是一些的代碼與鼠標事件和定時器控制。我嘗試了一個計時器來檢測鼠標何時停止,因爲我發現當鼠標沒有時平移不會停止。

// 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)); 
     } 
    } 

,並最終在開始時開始渲染我更新渲染目標變換

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; 
    } 
} 

而且修改的OnMouseMove這樣的:

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(); 

} 

不需要的DragStarted和CurrentMousePosition變量。

讓我知道,如果它的工作原理。

+0

感謝您的支持。平移速度現在似乎是正確的,但現在似乎存在與其移動方向有關的問題。如果我點擊並從中心拖到右下角,對象將移動到左上角。如果我然後停下來,然後單擊並拖動並向上移動鼠標,則對象將繼續在其原始路徑中移動到左上角,然後向下移動。如果我然後停下來,然後單擊並拖動以在屏幕上向左移動,則對象將返回到左上角。 – Gaz83

+0

你的'cam'變量的類型是什麼? – user1610015

+0

哦,類型凸輪只是我的相機類。 – Gaz83