如何围绕中心旋转此矩阵?

时间:2011-07-13 02:06:33

标签: c# xna physics farseer

我的XNA游戏使用Farseer Physics,这是一个2d物理引擎,带有可选的物理引擎数据渲染器,可以帮助您进行调试。可视调试数据非常有用,所以我根据相机的状态设置它。除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 :(得分:0)

解决这类问题的一种常见方法是将有问题的对象移动到“中心”,旋转并将其移回。 因此,在这种情况下,我建议应用一个转换,将相机“向上和向上”移动一半的屏幕尺寸,应用旋转然后将其移回。

答案 1 :(得分:0)

通常,为了围绕点(x,y,z)执行旋转,操作需要分解为3个概念部分:

  1. T是翻译矩阵,翻译为(-x,-y,-z)
  2. R是围绕相关轴旋转的旋转矩阵。
  3. T ^ -1是转换回(x,y,z)
  4. 的矩阵

    你所追求的矩阵是这三个乘法的结果,反之亦然:

    M = T ^ -1 * R ^ T

    你应该使用的x,y,z是你相机的位置。