当C/C++是首选语言时,在三维图形中表示固定维平面(struct)的首选方法是什么?
我们是不是应该
第一种方法需要额外的浮动/双倍,但另一方面,在正常运行的算法中效率更高,因为它已经预先计算过了。第一,如果我们分别改变正常值和偏移量,那么替代方案在数值上也是更稳定的。
发布于 2013-09-03 20:17:59
遗憾的是,C++并不是与飞机打交道的最佳语言。首先,我们可以认为使用四个浮点值是一个很好的选择,因为它适合于SSE和VMX中的SIMD寄存器。因此,我们可能有一个有一个128位成员的类,前三个值表示平面法线,最后一个值表示距离(就像同质坐标一样,如果我们只关心距离测试的符号,平面并不总是需要规范化的法线)。
但是,当我们与平面一起对点、球面和其他卷进行分类时,实现一个平面到点的距离函数将导致次优算法,因为大多数时候,我们知道我们会对少量的平面测试很多点。有优化的空间!
这里的问题有一个名字,事实上,不是问题,而是我们表达信息的方式。它是结构数组和数组结构( AOS与SOA )。
一个常见的运动在一个3D引擎是包围体积水果剔除!一个通常的截尾由6个平面组成,正确的表示不是一个带std::array<Plane,6>成员的frustum类,但最有可能的是,对于Y、Z和D,8 SIMD注册布局为:{ P0X, P1X, P2X, P3X }, { P4X, P5X, FREEPLANE1X, FREEPLANE2X }, ...等,不是C++,而是更适合于SIMD编程。
选择SOA代表点也可能是有用的。
结论:最好的表示取决于哪种算法和哪种数据集将去考虑你的飞机。
https://stackoverflow.com/questions/18600328
复制相似问题