XNA 2D相机失去精度

时间:2014-01-07 18:42:59

标签: matrix xna camera 2d

我为自上而下的游戏创建了一个2D相机(下面的代码)。当球员位置接近0.0x和0.0y时,一切正常。

不幸的是,随着距离的增加,变换似乎有问题,大约在0.0x 30e7y(是的,即3000万年),当玩家移动时相机开始颤抖(相机在每次更新结束时都会更新玩家位置在非常大的距离,10亿+相机甚至不会跟踪播放器,因为我猜测矩阵中的错误是否被过多放大。

我的问题是:矩阵中是否存在问题,或者是极端数字的标准行为。

相机变换方法:

public Matrix getTransform()
{
    Matrix transform;

    transform = (Matrix.CreateTranslation(new Vector3(-position.X, -position.Y, 0)) *
            Matrix.CreateRotationZ(rotation) * Matrix.CreateScale(new Vector3(zoom, zoom, 1.0f)) *
    Matrix.CreateTranslation(new Vector3((viewport.Width / 2.0f), (viewport.Height / 2.0f), 0)));

    return transform;
}

相机更新方法:

这请求给定ID的对象位置,它返回一个基本的Vector2,然后将其设置为摄像机位置。

if (camera.CameraMode == Camera2D.Mode.Track && cameraTrackObject != Guid.Empty)
{
    camera.setFocus(quadTree.getObjectPosition(cameraTrackObject));                    
}

如果任何人可以看到错误或启发我为什么矩阵挣扎我会非常感激。

1 个答案:

答案 0 :(得分:0)

我实际上找到了这个原因,这是我应该想到的。

我正在使用单精度浮点数,它只有7位精度。这对于较小的数字来说很好(我发现的最高可达250万大关)。当浮点数开始截断时,矩阵上的任何内容和矩阵中的乘法函数都会开始获得精度误差。

针对我的特定问题的最佳解决方案是引入一些人工缩放(我需要非常大的数字,因为模拟是在空间中设置的)。我将我的世界限制在500万单位平方(+/- 250万单位),并将提出另一种造粒世界的方式。

我在这里也找到了一个很好的答案:

Vertices shaking with large camera position values

这篇文章更详细地讨论了浮点数:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

感谢您的意见和评论!!