Как приблизить положение мыши в 2D в MonoGame - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующий класс камеры:

public Vector2 Position { get; set; } = Vector2.Zero;
public float Rotation { get; set; } = 0.0f;
public float Zoom
{
    get
    {
        // Negative zoom will flip the image
        if (_zoom < 0.1f)
        {
            _zoom = 0.1f;
        }
        return _zoom;
    }
    set
    {
        _zoom = value;
        // Negative zoom will flip the image
        if (_zoom < 0.1f)
        {
            _zoom = 0.1f;
        }
    }
}

public Matrix Transform(Viewport viewport)
{
    int viewportWidth = viewport.Width;
    int viewportHeight = viewport.Height;

    return
        Matrix.CreateTranslation(new Vector3(-Position.X - viewportWidth / 2, -Position.Y - viewportHeight / 2, 0)) * // Translation Matrix
        Matrix.CreateRotationZ(Rotation) * // Rotation Matrix
        Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) * // Scale Matrix
        Matrix.CreateTranslation(new Vector3(viewportWidth / 2, viewportHeight / 2, 0)); // Origin/Offset Matrix
}

public void Move(Vector2 amount)
{
    Position += amount;
}

И Update() метод, который проверяет пользовательский ввод с клавиатуры и мыши на определенные вещи, например, двигать, вращать, масштабировать.

Проблема

Как видно из моей матрицы преобразования, при увеличении / уменьшении (увеличение или уменьшение _zoom) я приближаюсь к фиксированной исходной точке - центру моего экрана.

Как я могу сделать это так, когда он приближается к курсору мыши?

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

1 Ответ

0 голосов
/ 20 января 2019

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

public Matrix Transform(Viewport viewport)
{
    int viewportWidth = viewport.Width;
    int viewportHeight = viewport.Height;

    return
        Matrix.CreateTranslation(new Vector3(-Position.X - viewportWidth / 2, -Position.Y - viewportHeight / 2, 0)) * // Translation Matrix
        Matrix.CreateRotationZ(Rotation) * // Rotation Matrix
        Matrix.CreateTranslation(new Vector3(-mouseState.X - viewportWidth / 2, -mouseState.Y - viewportHeight / 2, 0)) * //Mouse Translation Matrix
        Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) * // Scale Matrix
        Matrix.CreateTranslation(new Vector3(viewportWidth / 2, viewportHeight / 2, 0)); // Origin/Offset Matrix
}
...