我正在建立一个游戏引擎以获得乐趣,我正在尝试使用浮点数构建一个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_ );
}
在上面的函数中,我只能使用最大为Float.Max的平方根的x,y和z值。
有没有它,所以Vector的组件可以是Float.Max? 我现在知道如何处理这个问题的唯一方法是将组件限制为Float.Max的根目录。
编辑:我接受了Chnoch的建议并查看其他游戏引擎是否以类似的方式处理了问题。从Unity3D和idSoftware的Doom3引擎(https://github.com/id-Software/DOOM-3-BFG/blob/master/neo/idlib/math/Vector.h第630行)我可以看出,它们只允许可以用作root float.Max的最大浮点数。想想看,我真的不需要为我正在做的事情做很多数字。 感谢大家的帮助。
答案 0 :(得分:1)
如果它无论如何可能我只使用double而不是float。使用双精度表,您可以获得64位表示,从而可以访问更大范围的数字。有关浮点类型的比较,请参阅here。
在不同的数学库中,Vector3f附带了一个Vector3d类,它在内部使用double值。