我的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);
}
答案 0 :(得分:0)
解决这类问题的一种常见方法是将有问题的对象移动到“中心”,旋转并将其移回。 因此,在这种情况下,我建议应用一个转换,将相机“向上和向上”移动一半的屏幕尺寸,应用旋转然后将其移回。
答案 1 :(得分:0)
通常,为了围绕点(x,y,z)执行旋转,操作需要分解为3个概念部分:
你所追求的矩阵是这三个乘法的结果,反之亦然:
M = T ^ -1 * R ^ T
你应该使用的x,y,z是你相机的位置。