XNA - Получение координат мыши с помощью системы 2d Camera с вращением / масштабированием / переводом - PullRequest
4 голосов
/ 11 сентября 2010

У меня есть 2d камера с этой матрицей перевода:

        Transform = Matrix.CreateTranslation(new Vector3(-Position.X, -Position.Y, 0)) *
                     Matrix.CreateRotationZ(Rotation) *
                     Matrix.CreateScale(new Vector3(Scale, Scale, 0)) *
                     Matrix.CreateTranslation(new Vector3((GraphicsDevice.Viewport.Width * 0.5f), (GraphicsDevice.Viewport.Height * 0.5f), 0));

, который работает для поворота / масштабирования, где начало координат - центр камеры.

Теперь я пытаюсь получить координаты мыши в мире.

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

У меня есть это,

MousePosition = new Vector2 ((Mouse.GetState (). X - DrawTransform.Translation.X) * (1 / Gamecode.Camera1.Scale), (Mouse.GetState (). Y - DrawTransform.Translation.Y) * (1 / Gamecode.Camera1.Scale));

Но это не учитывает ротацию

1 Ответ

5 голосов
/ 11 сентября 2010

Как правило, проще и надежнее найти обратную матрицу, чем вычислять позицию клиента в мире вручную.

Проблема с вашей матрицей - причина, по которой вы не можете получить обратное, состоит в том, что вы уменьшаете ось Z до нуля.

Matrix.CreateScale(new Vector3(Scale, Scale, 0))

Это означает, что вы выровняли все пространство по одной оси. Таким образом, когда вы пытаетесь взять одну точку в этом пространстве (клиентское пространство) и вернуть ее в исходное пространство (мировое пространство), то, что вы получаете, на самом деле представляет собой линию, вытянутую вдоль оси Z. Вот почему вы получаете NaNs обратно. (Или вы могли бы просто сказать - вы ввели деление на ноль.)

Функция обратной матрицы не знает, что вы используете плоскую 2D-плоскость. Матрицы XNA 3D.

Исправление заключается в том, чтобы изменить вашу матрицу следующим образом:

Matrix.CreateScale(Scale)

Тогда попробуйте найти обратное.

...