저는 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();
감사합니다. 이동 속도는 이제 올바르게 보이지만 지금은 이동 방향에 문제가있는 것 같습니다. 중심에서 오른쪽 아래로 클릭하고 끌면 개체가 왼쪽 상단으로 이동합니다. 그런 다음 마우스를 멈추고 클릭 한 다음 마우스를 위로 움직이면 객체는 원래 경로에서 왼쪽 상단으로 계속 이동하지만 아래로 이동합니다. 그런 다음 중지하고 클릭 한 다음 화면 위로 왼쪽으로 이동하면 개체가 왼쪽 상단으로 돌아갑니다. – Gaz83
'cam' 변수의 유형은 무엇입니까? – user1610015
오, 타입 캠은 내 카메라 클래스입니다. – Gaz83