2014-09-24 37 views
0

我正在構建一個遊戲引擎以獲得樂趣,並且我正嘗試使用浮點數來構建Vector3類。 在測試過程中,我發現對於x,y或z值使用大浮點數會導致Vector3數學函數中斷,因爲它們需要使用的數字太大。在向量數學中的大型浮點數

public Vector3f CrossProduct(Vector3f vector1, Vector3f vector2) { 
    float x_ = vector1.getY() * vector2.getZ() - vector1.getZ() * vector2.getY(); 
    float y_ = vector1.getZ() * vector2.getX() - vector1.getX() * vector2.getZ(); 
    float z_ = vector1.getX() * vector2.getY() - vector1.getY() * vector2.getX(); 
    return new Vector3f(x_, y_, z_); 
} 

在上面的函數我只能用x,y和z值,最大Float.Max的平方根。

無論如何有它,所以矢量的組件可以是Float.Max? 我現在知道如何處理這個問題的唯一方法就是將組件限制在Float.Max的根目錄下。

編輯:我接受了Chnoch的建議,並期待看看其他遊戲引擎是否以類似的方式處理了這個問題。從Unity3D和idSoftware的Doom3引擎(https://github.com/id-Software/DOOM-3-BFG/blob/master/neo/idlib/math/Vector.h,第630行)我可以看出,他們只允許可以使用的最大浮點數爲float.Max。想想看,我並不需要非常大的數字來做我正在做的事情。 感謝大家的幫助。

+0

那是Vector3f與'cross,length,normalize'方法嗎?然後上面的就和'cross'一樣。你可以先把長度,規格化,然後進行縮放。請注意,使用'-',如果我理解正確,則需要將其限制爲Float Max平方根的一半。 – 2014-09-24 12:56:59

+0

看看你的表達式'vector1.getY()* vector2.getZ()';如果兩者中的任何一個靠近Float.MAX_VALUE,您預期會發生什麼? *當然*它溢出到無窮大。這就是float數據類型的行爲。使用更高的精度;例如。用double執行計算,然後將結果轉換回浮動。 – Durandal 2014-09-24 13:34:23

回答

1

如果它是無論如何我只是使用雙而不是浮動。隨着雙打,你會得到一個64位的表示,這導致了你可以訪問的數字範圍更大。有關浮點類型的比較,請參見here

在不同的數學庫中,有一個Vector3d類伴隨着Vector3f在內部使用double值。

+0

所以我可以說我公開使用我的Vector3f,並有一個私人的內部類Vector3d做Vector3f計算? 或者我會失去浮動和雙打之間的一些精度轉換? – James 2014-09-24 17:44:59

+0

那麼,如果你最終轉換爲浮點數,你仍然只能使用Float.MAX來獲得最終結果。公開使用雙打是不是選擇? – Chnoch 2014-09-26 10:04:28

+0

那麼對於Vector3f來說,組件可能比說根Float.MAX更大。看起來更有效的是限制組件的大小,而不是強制轉換爲計算值的兩倍。 雖然這說我採納了你的意見,並去了兩個功能的解決方案。更快的函數只會將浮點數限制爲Float.MAX,而另一個函數會將其轉換爲double,然後轉換回浮點數,以便對Vector3f組件的大小沒有任何限制。 – James 2014-09-26 15:47:02