我正在構建一個遊戲引擎以獲得樂趣,並且我正嘗試使用浮點數來構建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。想想看,我並不需要非常大的數字來做我正在做的事情。 感謝大家的幫助。
那是Vector3f與'cross,length,normalize'方法嗎?然後上面的就和'cross'一樣。你可以先把長度,規格化,然後進行縮放。請注意,使用'-',如果我理解正確,則需要將其限制爲Float Max平方根的一半。 – 2014-09-24 12:56:59
看看你的表達式'vector1.getY()* vector2.getZ()';如果兩者中的任何一個靠近Float.MAX_VALUE,您預期會發生什麼? *當然*它溢出到無窮大。這就是float數據類型的行爲。使用更高的精度;例如。用double執行計算,然後將結果轉換回浮動。 – Durandal 2014-09-24 13:34:23