C/C++中三维平面的优选表示
Preferred Representation of a 3D-Plane in C/C++
当C/C++是首选语言时,在3D图形中表示固定维平面(结构)的首选方式是什么。
我们应该吗
- 将归一化的平面法向量和原始距离存储为单独的实体,或者我们应该
- 将它们一起表示为非归一化向量
第一种替代方案需要一个额外的浮点/双精度,但另一方面,在对法线进行操作的算法中效率更高,因为它已经被预先计算过了。如果我们分别改变法线和偏移,第一种选择在数值上也更稳定。
遗憾的是,C++不是处理平面的最佳语言。首先,我们可以认为使用四个浮点值是一个不错的选择,因为它适合SSE和VMX中的SIMD寄存器。因此,我们可能有一个只有128位成员的类,前三个值表示平面法线,最后一个值表示距离(就像齐次坐标一样,如果我们只关心距离测试的符号,平面并不总是需要归一化法线)。
但是,当我们使用平面对点、球体和其他体积进行分类时,实现单个平面到点的距离函数将导致次优算法,因为大多数时候,我们知道我们将针对少量平面测试大量点。还有优化的空间!
这里的问题有一个名字,事实上,不是问题,而是我们表示信息的方式。它是结构阵列与阵列结构(AOS与SOA)。
在3D引擎中,一个常见的练习是边界体积截头体剔除!通常的截头体由6个平面组成,正确的表示不是具有std::array<Plane,6>
成员的frustum类,但最有可能的是,8个SIMD寄存器的布局为:{ P0X, P1X, P2X, P3X }, { P4X, P5X, FREEPLANE1X, FREEPLANE2X }, ...
,依此类推,用于Y、Z和D。不是C++,但用于SIMD编程要好得多。
更喜欢SOA对点的重新补偿也可能是有用的。
结论:最好的表示取决于什么算法和什么样的数据集会进入你的平面。
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 如何计算Big-O表示法中的平均渐近运行时间
- 我应该如何表示我拥有的连续元素序列?
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 表示类模板C++空类型
- 具有所表示类的相同构造函数签名的代理类模板
- 嵌套在循环中的两个循环的 big-O 表示法
- 具有引用成员的结构是否具有唯一的对象表示形式
- 使用 int 表示浮点除法 C++
- 需要一种在平面表示中进行数组索引的算法
- C/C++中三维平面的优选表示