Matrix XNA 2D摄像机失准

Matrix XNA 2D摄像机失准,matrix,xna,camera,2d,Matrix,Xna,Camera,2d,我已经为自上而下的游戏创建了一个2D摄像头(代码如下)。当玩家的位置接近0.0x和0.0y时,一切正常 不幸的是,随着距离的增加,变换似乎有问题,在大约0.0x 30e7y(是的,这是3000万y)的情况下,当玩家移动时(每次更新结束时,相机会根据玩家的位置进行更新),相机开始抖动。在非常大的距离上,十亿以上的相机甚至不会跟踪玩家,正如我所猜测的,矩阵中的错误被放大了太多 我的问题是:矩阵中是否存在问题,或者这是极端数的标准行为 摄影机变换方法: public Matrix getTransfo

我已经为自上而下的游戏创建了一个2D摄像头(代码如下)。当玩家的位置接近0.0x和0.0y时,一切正常

不幸的是,随着距离的增加,变换似乎有问题,在大约0.0x 30e7y(是的,这是3000万y)的情况下,当玩家移动时(每次更新结束时,相机会根据玩家的位置进行更新),相机开始抖动。在非常大的距离上,十亿以上的相机甚至不会跟踪玩家,正如我所猜测的,矩阵中的错误被放大了太多

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

摄影机变换方法:

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的对象位置,并返回一个基本矢量2,然后将其设置为摄影机位置

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

如果有人能看到一个错误或者告诉我矩阵为什么会挣扎,我将不胜感激

我已经找到了原因,这是我应该想到的

我使用的是单精度浮点,它的精度只有7位。对于较小的数字(我发现大约有250万大关)来说,这很好。当浮点数开始截断时,矩阵中的乘法函数开始获得精度误差

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

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

这是一篇很好的文章,更详细地讨论了浮点:


谢谢你的意见和评论

这很奇怪。我猜需要这些非常高的数字(以百万计)?如果可能的话,我的第一个建议是减少这个问题。我已经找到了解决方法,并在下面发布了错误的原因,谢谢你的评论:D