Python 遮挡剔除

时间:2021-03-01 14:33:19

标签: python numpy opencv blender occlusion-culling

快速总结:

我正在寻找不使用光线投射的遮挡剔除(给定相机位置和网格的已知多边形坐标)的 Python 实现(Blender、numpy、OpenCV)。

背景:

我有一个表示为向量的简化几何坐标数据集,我想以最佳方式计算遮挡剔除,以便将该坐标数据转换为 SVG 图像。我不太关心 SVG 实现,而是计算遮挡剔除的最佳数学解决方案。渲染引擎计算这一点的典型方法是将光线从相机投射到每个网格顶点并测试它们是否发生碰撞。由于我希望制作简单的 SVG 线条图像,因此我想避免光线投射。

通过 Hidden-surface determination wiki 搜索,描述了一些方法。 其中一些是 Portal RenderingPotentially visible setZ-culling。鉴于这些算法的少数 Pythonic 实现,我想知道哪种实现在计算上最有效并产生最好的结果。如果您有更好的方法或组合,请随时提出建议。遮挡剔除有很多用例,但我关注的两个主要用例如下。

内部网格遮挡

如图:1. 在搅拌机中进行 3d 渲染,2. 所有可见的网格边缘,3. 使用 ray casting plugin

剔除的网格边缘

对于坐标数据,我的大部分几何图形都使用简单的形状。因此,如 here 所述的背面剔除是渲染基本形状的快速简便的解决方案。但是,当存在背面的几何图形并且可见几何图形中时,就会出现问题。正如您在上面的光线投射示例中看到的,当相机面向平面时,网格的其他多边形面不可见。使用背面剔除时如下图

enter image description here

您可以看到背离相机的多边形面被剔除,但指向相机的面保留。给定相机位置的网格多边形遮挡剔除对于渲染具有一定复杂性的小对象很重要。

多物体遮挡

如图:1. 在搅拌机中进行 3d 渲染,2. 所有可见的网格边缘,3. 使用 ray casting plugin

剔除的网格边缘

遮挡剔除更明显的例子是在多个对象的情况下。虽然我可以简单地从后向前绘制 SVG 层,但这会增加不需要的层。以理想的方式解决内部网格剔除的多边形剔除也将允许分层对象剔除。

总结

我正在寻找在给定顶点列表(结构化以形成多边形)的情况下计算遮挡剔除的解决方案,并在不向每个顶点投射光线的情况下计算哪些对相机可见。

0 个答案:

没有答案