2D масштабирование координат XNA / C # в World Matrix до 3D View Matrix? - PullRequest
2 голосов
/ 17 августа 2011

Это моя трансформация. Я получил это на примере простой 2D камеры.

    public Matrix Transform(GraphicsDevice graphicsDevice)
    {
        float ViewportWidth = graphicsDevice.Viewport.Width;
        float ViewportHeight = graphicsDevice.Viewport.Height;

        matrixTransform =
          Matrix.CreateTranslation(new Vector3(-cameraPosition.X, -cameraPosition.Y, 0)) *
              Matrix.CreateRotationZ(Rotation) *
              Matrix.CreateScale(new Vector3(Zoom, Zoom, 0)) *
              Matrix.CreateTranslation(
                    new Vector3(ViewportWidth * 0.5f, ViewportHeight * 0.5f, 0));
        return matrixTransform;
    } 

Если я правильно понимаю, он допускает поворот (вращение), изменение масштаба спрайта при масштабировании и перемещение между миром и камерой для простого управления вверх, вниз, влево, вправо. Тем не менее, это не меняет глубину Z.

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

Я ОЧЕНЬ НОВЫЙ в программировании и имею только простое понимание матрицы в целом. Я еще меньше понимаю, как XNA использует их в методе рисования. И до сих пор мне хочется вырвать волосы из бесплодного поиска ответов ... Мне просто нужно, чтобы мировые координаты масштабировались при увеличении, чтобы, прежде чем моя мышь с предварительным увеличением, X.60 Y.60 будет в X 0,600 Y.600 после увеличения (т. Е. Уровень масштабирования 0,1). Но моя мышь не двигалась, только мир стал больше (или уменьшился).

Ответы [ 3 ]

1 голос
/ 25 ноября 2014

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

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

Matrix.CreateScale(zoom, zoom, 0);

Координаты мыши должны бытьобратное масштабируется и сдвигается на нужный перевод:

float ViewportWidth = graphicsDevice.Viewport.Width;
float ViewportHeight = graphicsDevice.Viewport.Height;

Matrix scale = Matrix.CreateScale(zoom, zoom, 0);
Matrix inputScalar = Matrix.Invert(scale);

...

public MouseState transformMouse(MouseState mouse)
{
    /// Shifts the position to 0-relative
    Vector2 newPosition = new Vector2(mouse.X - ViewportWidth,
                                      mouse.Y - ViewportHeight);

    /// Scales the input to a proper size
    newPosition = Vector2.Transform(newPosition, InputScalar);

    return new MouseState((int)newPosition.X, (int)newPosition.Y,
                          mouse.ScrollWheelValue, mouse.LeftButton,
                          mouse.MiddleButton, mouse.RightButton,
                          mouse.XButton1, mouse.XButton2);
}
0 голосов
/ 18 августа 2011

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

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

Так как преобразование осуществляется с помощью Zoom в Matrix.CreateScale (новый Vector3 (Zoom, Zoom, 0)), то же самое необходимо масштабировать координаты mouseState X & Y, чтобы виртуально отражать мирматрица.

    //Offsets any cam location by a zoom scaled window bounds
    Vector2 CamCenterOffset
    {
        get { return new Vector2((game.Window.ClientBounds.Height / Zoom)
             * 0.5f, (game.Window.ClientBounds.Width / Zoom) * 0.5f);
        }
    }

    //Scales the mouse.X and mouse.Y by the same Zoom as everything.
    Vector2 MouseCursorInWorld
    {
        get
        {
            currMouseState = Mouse.GetState();
            return cameraPosition + new Vector2(currMouseState.X / Zoom,
                currMouseState.Y / Zoom);
        }
    }
0 голосов
/ 17 августа 2011

Вы используете 2D координаты, поэтому координата Z не имеет абсолютно никакого значения.Фактически, используемая вами матрица масштабирования (Matrix.CreateScale(new Vector3(Zoom, Zoom, 0))) умножает координату Z на 0, фактически устанавливая ее равной 0.

Поскольку эта матрица масштабирования находится в матрице вида, она масштабирует весь мир.Я не уверен, что действительно понял вашу проблему.Не могли бы вы попытаться объяснить это немного больше, пожалуйста?

...