2014-01-07 103 views
1

我爲自上而下的遊戲創建了2D相機(代碼如下)。當玩家位置接近0.0x和0.0y時,一切正常。XNA 2D相機鬆動精度

不幸的是,隨着距離的增加,轉換似乎會出現問題,大約在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,它返回一個基本Vector2,然後將其設置爲攝像頭的位置。

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

如果任何人可以看到一個錯誤或啓發我爲什麼矩陣鬥爭,我將不勝感激。

+0

這很奇怪。我猜這是非常高的數字(以百萬計)需要?因爲我的第一個建議是如果可能的話減少這個。 – tjheslin1

+0

我已經找到了解決辦法,並在下面發佈了錯誤原因,感謝您的評論:D – user3170345

回答

0

我已經找到了原因,這是我應該想到的。

我正在使用單精度浮點,它只能精確到7位數。對於較小的數字(達到我找到的約250萬大關),這沒問題。隨着浮動開始截斷,任何超過此值的矩陣中的乘法函數都會開始獲得精度錯誤。

對於我的特定問題,最好的解決方案是引入一些人工縮放(我需要非常大的數字,因爲模擬是在空間中設置的)。我把我的世界限制在500萬個單位平方米(+/- 250萬個單位),並且會想出另一種造粒世界的方式。

我也發現了這個好答案在這裏:

Vertices shaking with large camera position values

而且,在更詳細論述浮動分的好文章:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

感謝您的意見和註釋!!