gpt4 book ai didi

c++ - C/C++ 中 3D 平面的首选表示

转载 作者:太空宇宙 更新时间:2023-11-04 08:53:30 24 4
gpt4 key购买 nike

当 C/C++ 是首选语言时,在 3D 图形中表示固定维度平面(结构)的首选方法是什么。

我们应该

  1. 将归一化的平面法 vector 和原点距离存储为单独的实体,或者我们应该
  2. 在非标准化 vector 中一起表达它们?

第一种选择需要一个额外的 float / double ,但另一方面在正常运行的算法中效率更高,因为它已经预先计算好了。如果我们分别改变法线和偏移量,第一个备选方案在数值上也更稳定。

最佳答案

遗憾的是,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 表示也可能有用。

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

关于c++ - C/C++ 中 3D 平面的首选表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18600328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com