XNA 2d камера с произвольным масштабированием - PullRequest
4 голосов
/ 19 февраля 2012

У меня есть рабочая 2D-камера в XNA со следующими внутренностями:

ms = Mouse.GetState();
msv = new Vector2(ms.X, ms.Y);  //screenspace mouse vecor
pos = new Vector2(0, 0); //camera center of view
zoom_center = cursor; //I would like to be able to define the zoom center in world coords
offset = new Vector2(scrnwidth / 2, scrnheight / 2);
transmatrix = Matrix.CreateTranslation(-pos.X, -pos.Y, 0)
    * Matrix.CreateScale(scale, scale, 1)
    * Matrix.CreateTranslation(offset.X, offset.Y, 0);
inverse = Matrix.Invert(transmatrix);
cursor = Vector2.Transform(msv, inverse);  //the mouse position in world coords      

Я могу переместить положение камеры вокруг и изменить уровень масштабирования (с другим кодом, который я не вставил здесь для краткости). Камера всегда приближается к центру экрана, но я хотел бы иметь возможность масштабировать произвольную точку увеличения (в данном случае курсор), как в инди-игре dyson http://www.youtube.com/watch?v=YiwjjCMqnpg&feature=player_detailpage#t=144s

Я перепробовал все комбинации, которые имеют для меня смысл, но я полностью застрял.

Ответы [ 2 ]

4 голосов
/ 31 октября 2012

Я сделал это, это код и пояснения:

Получите мышиный кудес в пространстве камеры:

 msx = Mouse.X - Viewport.Width/2;
 msy = Mouse.Y - Viewport.Height/2;

Получение расстояния от камеры до мыши в пространстве камеры

 var width = CameraTranslation.X - msX;
 var height = CameraTranslaton.Y + msY;

Получите смещение, созданное новым зумом, а затем выведите его в положение камеры

 CameraTranslation.X -= width * (1-newZoom/_zoom);
 CameraTranslation.Y -= height * (1-newZoom/_zoom);

 _zoom = newZoom;
2 голосов
/ 01 марта 2012

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

zoom_center = pos = cursor + (scale_prior_to_zoom/scale) * (pos - cursor);

Надеюсь, это работает, как я только попробовал на бумаге, так что вам, возможно, придется немного изменить это ... но это должно заставить вас хотя бы указывать в правильном направлении. Вот вспомогательная математика, которую я сделал только с измерением X.

курсор = (1,1)

pos = (5,5)

Увеличение Позиция должна быть ближе к курсору

scale = 2 scale_prior_to_zoom = 1

posX = 1 + (1/2) (5 - 1)

posX = 1 + 0,5 * 4

posX = 1 + 2

posX = 3

Уменьшение Положение должно быть дальше от курсора

scale = 1 scale_prior_to_zoom = 2

posX = 1 + (2/1) (5 - 1)

posX = 1 + 2 * 4

posX = 1 + 8

posX = 9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...