2016-11-30 14 views
0

Я новичок в DirectX и Direct3D/2D и только в настоящее время экспериментирует с тем, следует ли делать просмотрщик кад для машины, которую мы имеем.2D-панорамирование камеры в SharpDX

Я использую элемент управления здесь Direct2dOnWPF, чтобы включить отображение Direct2D в окне WPF с помощью SharpDX.

В настоящий момент у меня есть элемент управления, который загружает файл и отображает чертеж.

Я создал камеру, и я реализовал масштабирование (до некоторой степени), но моя проблема связана с панорамированием. Проблема в том, что при панорамировании я ожидаю, что рисунок будет перемещаться с помощью мыши, но это не так. Небольшие движения, которые он делает, но более крупные движения заставляют рисунок двигаться за пределы движения мыши. Почти как я двигаю мышь одним движением, тем быстрее она движется.

ОК, код 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)); 
     } 
    } 

и, наконец, на старте начать рендеринг я обновить RenderTarget Transform

target.Transform = cam.GetTransform3x2(); 

ответ

0

Я считаю, что вы вычислить координаты неправильно. Во-первых, вам нужно установить переменную MouseOrigin в OnLeftMouseButtonDown и не изменять его в любой другой метод:

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

oh тип cam - это только класс камеры. – Gaz83

 Смежные вопросы

  • Нет связанных вопросов^_^