我有以下问题:我需要生成3d模型的2d视图。在正常的情况下,这当然是微不足道的:只需使用画家的算法或类似技术将所有内容渲染到屏幕上。不幸的是,输出需要是2d几何体,以便可以将其发送到CAD软件包。这意味着隐藏表面移除必须在矢量级别而不是像素级别上完成,这使得大多数标准方法(画家算法,z缓冲区等)无法使用。
我发现执行对象空间隐藏表面移除的最常见技术是使用BSP树,理论上它可以正常工作。所以我实现了这一点,但性能甚至都不可接受,考虑到其O(n 2 )的复杂性,这并不奇怪。我正在使用的测试场景在背面剔除后有大约4800个三角形,但是我希望算法需要处理大约5或10倍这个数字的场景,当你需要对它进行平方时,它会很快变得相当大。我们几何库的(缺乏)速度也没有任何帮助。
我已经尝试了不同的尝试解决这个性能问题的方法,主要是基于将三角形分成较小的组以减少O的影响的想法(n 2 ) ,例如八叉树(超过一半的多边形存储在根节点中)并将2d投影场景划分为10x10网格以减少每平方三角形的数量(工作,但多边形交叉点的减少超过了需要重复这个过程100次。
今天我又通过将所有三角形投影到2D并通过首先测试边界正方形是否重叠来查看哪些相交,然后针对两个多边形的每个组合测试每个边缘交点(3x3 = 9)。对于线交点,我使用描述here的算法绕过了几何库。总共大约有1160万个线路交叉点,大约需要30秒,这仍然太长了(我说绝对最大运行时间大约是5秒),不要紧,这只是算法的一部分。 / p>
我开始没有关于如何解决这个性能问题的想法,并且希望你们中的任何人都能有一些好的想法来获得更好的算法。我能想到的所有都是O(n 2 )。
答案 0 :(得分:1)
我参加聚会有点晚了但如果这个问题从未解决过,我的建议是使用阴影矩阵并将几何投影到一个平面上,这样你就可以得到一个给定3D场景的2D表示方向而不去屏幕空间/像素。
答案 1 :(得分:0)
我会使用改进的Bresenham算法,在那里你计算一条线所有像素交叉(也许这个算法有一个名称btw)。完整的方法是:
n x m
空间索引(每个网格有一个多边形排序列表),n和m非常大(假设1000x1000个单元格)。步骤3应确保您修剪最大潜在交叉点的数量。步骤2是O(n),并且对于小多边形(少量交叉单元)应该非常快。
您甚至可以动态调整空间索引网格大小,根据总多边形数量,平均多边形大小等查看以前的结果和/或启发式算法......