0

What is the preferred way of representing a fixed-dimensional plane (struct) in a 3D-graphics when C/C++ is the preferred language.

Should we

  1. store the normalized plane normal vector and origo-distance as separate entities or should we
  2. express them together in a non-normalized vector?

First alternative requires one extra float/double but is other hand more efficient in algorithms that operate on the normal because it is already precalculated. First alternative is also more numerically stable if we vary the normal and offset separately.

4

1 回答 1

2

遗憾的是,C++ 并不是使用飞机的最佳语言。我们起初可以认为使用四个浮点值是一个不错的选择,因为它适合 SSE 和 VMX 中的 SIMD 寄存器。因此,我们可能有一个具有单个 128 位成员的类,前三个值表示平面法线,最后一个值表示距离(就像齐次坐标一样,如果我们只关心距离测试的符号,平面并不总是需要归一化法线)。

但是,当我们使用平面对点、球体和其他体积进行分类时,实现单个平面到点的距离函数将导致算法不理想,因为大多数时候,我们知道我们将针对少量点测试大量点的飞机。有优化空间!

这里的问题有一个名字,其实不是问题,而是我们可能表示信息的方式。它是结构数组与数组结构( AOS 与 SOA )。

3D 引擎中的一个常见练习是包围体截锥剔除!通常的截锥体由 6 个平面组成,正确的表示不是具有std::array<Plane,6>成员的截锥体类,但很可能是 8 个 SIMD 寄存器布局为:{ P0X, P1X, P2X, P3X }, { P4X, P5X, FREEPLANE1X, FREEPLANE2X }, ...Y、Z 和 D 依此类推。不是 C++,但对于 SIMD 编程要好得多.

更喜欢 SOA 表示点也可能很有用。

结论:最佳表示取决于您的飞机将使用哪种算法和哪种数据集。

于 2013-09-03T20:17:59.603 回答