Как я могу повернуть эту матрицу вокруг центра? - PullRequest
1 голос
/ 13 июля 2011

Моя игра XNA использует Farseer Physics, который представляет собой двумерный физический движок с дополнительным средством визуализации данных физического движка, чтобы помочь вам в отладке.Визуальные данные отладки очень полезны, поэтому я настроил их для отображения в соответствии с состоянием моей камеры.Это работает отлично, за исключением вращения оси Z.Видите, у меня есть класс камеры, который поддерживает движение, масштабирование и поворот по оси Z.Мой класс отладки использует средство отладки Farseer для создания матриц, которые делают отладочные данные отображаемыми в соответствии с камерой, и он делает это хорошо, за исключением одной вещи ... вращение оси Z использует верхний левый угол экрана для (0, 0), в то время как моя камера вращается, используя центр области просмотра как (0, 0).У кого-нибудь есть советы для меня?Если бы я мог заставить ящик отладки вращаться из центра, он отлично бы работал с моей камерой.

        public void Draw(Camera2D camera, GraphicsDevice graphicsDevice)
    {
        // Projection (location and zoom)
        float width = (1f / camera.Zoom) * ConvertUnits.ToSimUnits(graphicsDevice.Viewport.Width / 2);
        float height = (-1f / camera.Zoom) * ConvertUnits.ToSimUnits(graphicsDevice.Viewport.Height / 2);
        //projection = Matrix.CreateOrthographic(width, height, 1f, 1000000f);
        projection = Matrix.CreateOrthographicOffCenter(
            -width,
            width,
            -height,
            height,
            0f, 1000000f);

        // View (translation and rotation)
        float xTranslation = -1 * ConvertUnits.ToSimUnits(camera.Position.X);
        float yTranslation = -1 * ConvertUnits.ToSimUnits(camera.Position.Y);
        Vector3 translationVector = new Vector3(xTranslation, yTranslation, 0f);
        view = Matrix.CreateRotationZ(camera.Rotation) * Matrix.Identity;
        view.Translation = translationVector;

        DebugViewXNA.RenderDebugData(ref projection, ref view);
    }

Ответы [ 2 ]

0 голосов
/ 13 июля 2011

Как правило, для выполнения поворота вокруг точки (x, y, z) операцию необходимо разбить на 3 концептуальных части:

  1. T - это матрица перевода, которая переводится как (-x, -y, -z)
  2. R - матрица вращения, которая вращается вокруг соответствующей оси.
  3. T ^ -1 - это матрица, которая переводит обратно в (x, y, z)

Матрица, которую вы ищете, является результатом умножения этих 3 в обратном порядке:

M = T ^ -1 * R ^ T

x, y, z, которые вы должны использовать, - это позиция вашей камеры.

0 голосов
/ 13 июля 2011

Один из распространенных подходов к решению подобных проблем - переместить рассматриваемый объект в «центр», повернуть и переместить его назад. Поэтому в этом случае я бы предложил применить преобразование, которое перемещает камеру «вверх и поперек» на половину размеров экрана, применяет вращение и затем перемещает его назад.

...