我为自上而下的游戏创建了一个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));
}
如果任何人可以看到错误或启发我为什么矩阵挣扎我会非常感激。
答案 0 :(得分:0)
我实际上找到了这个原因,这是我应该想到的。
我正在使用单精度浮点数,它只有7位精度。这对于较小的数字来说很好(我发现的最高可达250万大关)。当浮点数开始截断时,矩阵上的任何内容和矩阵中的乘法函数都会开始获得精度误差。
针对我的特定问题的最佳解决方案是引入一些人工缩放(我需要非常大的数字,因为模拟是在空间中设置的)。我将我的世界限制在500万单位平方(+/- 250万单位),并将提出另一种造粒世界的方式。
我在这里也找到了一个很好的答案:
Vertices shaking with large camera position values
这篇文章更详细地讨论了浮点数:
What Every Computer Scientist Should Know About Floating-Point Arithmetic
感谢您的意见和评论!!