Я пишу 2D-игру, в которой в моем игровом мире ось X движется слева направо, а ось Y - сверху вниз, а ось Z - вне экрана:
Хотя мой игровой мир нисходящий, игра отображается с небольшим уклоном:
Я работаю над проецированием из мирового пространства на пространство экрана и наоборот. У меня бывший работает следующим образом:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
Метод NegateY()
расширения делает именно то, на что это похоже, так как XNA у оси проходит снизу вверх , а не сверху вниз. Снимок экрана выше показывает, что все это работает. По сути, у меня есть куча точек в трехмерном пространстве, которые я затем визуализирую в пространстве экрана. Я могу изменять свойства камеры в режиме реального времени и видеть ее анимацию в новой позиции. Очевидно, что моя настоящая игра будет использовать спрайты, а не точки, и положение камеры будет фиксированным, но я просто пытаюсь получить всю математику перед тем, как перейти к этому.
Теперь я пытаюсь обратить обратно в другую сторону. То есть, учитывая точки x и y в пространстве экрана выше, определяют соответствующую точку в мировом пространстве. Поэтому, если я наведу курсор, скажем, на нижний левый угол зеленой трапеции, я хочу получить показания мирового пространства (0, 480). Г координат не имеет значения. Или, скорее, координата z всегда будет нулевой при отображении обратно в мировое пространство. По сути, я хочу реализовать этот метод подписи:
public Vector2 ScreenPointToWorld(Vector2 point)
Я попробовал несколько вещей, чтобы заставить это работать, но мне просто не везет. Мое последнее мнение состоит в том, что мне нужно Viewport.Unproject
дважды позвонить с разными значениями ближнего / дальнего z , вычислить результирующий результат Ray
, нормализовать его, а затем вычислить пересечение Ray
с a, Plane
которое в основном представляет уровень земли моего мира. Однако я застрял на последнем шаге и не был уверен, что я слишком усложняю вещи.
Кто-нибудь может указать мне правильное направление о том, как этого добиться?