java - vector 数学中的大 float

标签 java math game-engine

我正在构建一个游戏引擎来娱乐,并且我正在尝试使用 float 构建一个 Vector3 类。 在测试过程中,我发现对 x、y 或 z 值使用大 float 会导致 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 行),它们只是允许可用于根 float.Max 的最大 float 。想想看,我所做的事情并不需要很大的数字。 感谢大家的帮助。

最佳答案

如果可能的话,我会使用 double 而不是 float 。使用 double ,您可以获得 64 位表示形式,这导致您可以访问的数字范围明显更大。请参阅here用于浮点类型的比较。

在不同的数学库中,有一个 Vector3d 类伴随着 Vector3f,它在内部使用 double 值。

关于java - vector 数学中的大 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26017203/

相关文章:

Java 8 流 : iterate over Map of Lists

java - 对 gremlin 服务器使用 gremlin 遍历 (Tinkergraph)

java - Tomcat7 maven 插件 - 与 maven 资源插件一起使用时重新加载资源

math - float 学有问题吗?

java - Connect 4 Java Win 条件检查

java - @VisibleForTesting 和@Deprecated int 单元测试之间的区别

c# - 计算 3D 平面多边形的质心

javascript - 如何在 Javascript 中求正态分布?

c++ - 在 vector 中的指针上使用 delete

c++ - 在 C++ 中使用::每次