2016-11-30 4 views
0

Ich bin neu in DirectX und Direct3D/2D etc und führe gerade ein Experiment durch, ob wir einen Cad Viewer für eine Maschine machen wollen, die wir haben.2D Kameraschwenk in SharpDX

Ich verwende das Steuerelement von hier Direct2dOnWPF, damit ich Direct2D auf WPF-Fenster mit SharpDX anzeigen kann.

Im Moment habe ich das Steuerelement arbeiten und es lädt eine Datei und zeigt eine Zeichnung.

Ich habe jetzt eine Kamera erstellt und ich habe Zoom (bis zu einem gewissen Grad) implementiert, aber mein Problem ist mit Panning. Das Problem ist, dass ich beim Verschieben erwarte, dass sich die Zeichnung mit der Maus bewegt, aber nicht. Kleine Bewegungen machen es zwar, aber größere Bewegungen führen dazu, dass sich die Zeichnung über die Mausbewegung hinaus bewegt. Fast so, je weiter ich die Maus in einer einzigen Bewegung bewege, desto schneller bewegt sie sich.

Ok ein Code, das Direct2DControl basiert auf einem Image-Steuerelement, so habe ich Zugriff auf Mausereignisse usw. Hier ist der Code auf der Steuerung mit Mausereignissen und einem Timer. Ich habe versucht, einen Timer zu erkennen, wenn die Maus gestoppt wurde, da ich festgestellt habe, dass das Schwenken nicht aufhören würde, wenn die Maus das tat.

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

und das Schwenken in Kameraklasse durch Verschieben der Position.

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

und schließlich zu Beginn des beginne ich die RenderTarget

target.Transform = cam.GetTransform3x2(); 

Antwort

0

I Trans Rendering aktualisieren glauben Sie die Koordinaten falsch sind zu berechnen. Zuerst müssen Sie die MouseOrigin Variable in OnLeftMouseButtonDown setzen und modifiziere es in keiner anderen Methode:

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

Und ändern OnMouseMove wie folgt aus:

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

} 

Die Drag und CurrentMousePosition Variablen nicht benötigt werden, .

Lassen Sie mich wissen, ob es funktioniert.

+0

Danke dafür. Die Schwenkgeschwindigkeit scheint jetzt richtig zu sein, aber jetzt scheint es ein Problem mit der Richtung zu geben, in die sie sich bewegt. Wenn ich auf die Mitte rechts unten klicke und ziehe, bewegen sich die Objekte nach oben links. Wenn ich dann stoppe und dann klicke und ziehe und die Maus nach oben bewege, bewegen sich die Objekte weiter in ihrem ursprünglichen Pfad nach oben links, aber dann bewegt sie sich nach unten. Wenn ich dann stoppe und dann klicke und ziehe, um nach links über den Bildschirm zu gehen, geht das Objekt zurück nach oben links. – Gaz83

+0

Was ist der Typ Ihrer 'cam' Variable? – user1610015

+0

oh der Typ Cam ist nur meine Kamera Klasse. – Gaz83

Verwandte Themen