快速总结:
我正在寻找一个不使用光线投射的遮挡剔除(给定相机位置和网格的已知多边形坐标)的pythonic实现(blender,numpy,OpenCV)。
背景:
我有一个表示为矢量的简化几何坐标数据集,我想以最佳方式计算遮挡剔除,以便将该坐标数据转换为 SVG 图像。我不太关心 SVG 的实现,而是计算遮挡剔除的最佳数学解决方案。渲染引擎计算这一点的典型方法是将光线从相机投射到每个网格顶点并测试它们是否发生碰撞。因为我想制作简单的 SVG 线条图像,所以我想避免光线投射。
搜索隐藏表面确定wiki,其中描述了一些方法。其中一些是Portal Rendering、Potentially visible set和Z-culling。鉴于这些算法的少数 pythonic 实现,我想知道哪种实现在计算上最有效并产生最好看的结果。如果您有更好的方法或组合,请随时提出建议。遮挡剔除有很多用例,但我关心的两个主要用例如下。
内部网格遮挡
图为:1. 在搅拌机中进行 3d 渲染,2. 所有可见的网格边缘,3. 使用光线投射插件剔除的网格边缘
对于坐标数据,我拥有的大多数几何图形都使用简单的形状。因此,此处描述的背面剔除是渲染基本形状的快速简便的解决方案。但是,当存在不是背面且位于可见几何图形内的几何图形时,就会出现问题。正如您在上面的光线投射示例中看到的那样,当相机面向平面时,网格的其他多边形面不可见。使用下图所示的背面剔除时
您可以看到背对相机的多边形面被剔除,但指向相机的面仍然存在。给定相机位置的网格多边形的遮挡剔除对于渲染具有一定复杂性的小对象很重要。
多对象遮挡
图为:1. 在搅拌机中进行 3d 渲染,2. 所有可见的网格边缘,3. 使用光线投射插件剔除的网格边缘
遮挡剔除的更明显示例是在多个对象的情况下。虽然我可以简单地从后到前绘制 SVG 图层,但这会添加不需要的图层。以理想地解决内部网格剔除的方式剔除多边形也将允许分层对象剔除。
概括
我正在寻找解决方案来计算给定顶点列表(结构化以形成多边形)的遮挡剔除,并计算哪些顶点对相机可见,而无需将光线投射到每个顶点。