Я новичок в 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();
Благодарим за это. Скорость панорамирования теперь кажется правильной, но теперь, похоже, проблема с направлением, в котором она движется. Если я нажимаю и перетаскиваю из центра в нижнее правое, объекты перемещаются вверх влево. Если я остановлюсь, а затем нажмите и перетащите и переместите мышь вверх, объекты продолжают двигаться по исходному пути в верхнем левом углу, а затем он перемещается вниз. Если я затем остановлюсь, а затем нажмите и перетащите, чтобы переместить влево по экрану, объект вернется в верхний левый. – Gaz83
Какой тип переменной 'cam'? – user1610015
oh тип cam - это только класс камеры. – Gaz83