当C / C ++是首选语言时,在3D图形中表示固定维平面(结构)的首选方法是什么。
我们应该
第一个替代方案需要一个额外的浮点/双精度,但另一方面在正常运算的算法中更有效,因为它已经预先计算。如果我们分别改变法线和偏移,第一种选择也在数值上更稳定。
答案 0 :(得分:2)
可悲的是,C ++并不是使用飞机的最佳语言。我们首先可以认为使用四个浮点值是一个不错的选择,因为它适合SSE和VMX中的SIMD寄存器。所以我们可能有一个具有单个128位成员的类,前三个值表示平面法线,最后一个距离表示juste(如同我们只关心距离测试的符号,平面并不总是需要标准化法线) )。
但是当我们使用平面对点,球体和其他体积进行分类时,实现单个平面到点距离函数将导致次优算法,因为大多数时候,我们知道我们将测试很多点少数飞机。有优化的空间!
这里的问题有一个名字,实际上不是问题,而是我们表示信息的方式。它是结构阵列与阵列结构(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代表也是有用的。
结论:最佳表示取决于您的飞机将采用何种算法以及哪种数据集。