【问题标题】:Physically Based Rendering shows discontinuity on closed surface基于物理的渲染显示封闭曲面上的不连续性
【发布时间】:2022-11-25 06:55:43
【问题描述】:

我用 pyvista.Plotter() 添加了一个网格

p.add_mesh(mesh, show_edges=True, color='linen', pbr=True, metallic=0.8, roughness=0.1, diffuse=1)

但它显示不连续(网格开始和结束的地方)

为什么这个细胞连接点不同于这个环形线圈周围的类似细胞连接处?

【问题讨论】:

    标签: python mesh pyvista pbr


    【解决方案1】:

    这可能是由于表面法线的计算方式,以及您的网格连接沿着该边缘关闭。

    您经常生成此类封闭曲面的方法是根据一些广义坐标进行参数化,在这种情况下,其中之一是方位角。你的方位角扫描开始的地方(遵循物理约定:phi = 0对应于+x轴)和结束(phi = 2*pi,再次+x轴)重叠,但如果你不注意确保连接越过这个边界,你就没有一个封闭的环形线圈,而是一个打开的管子,它自己折回,在两个开口端相遇的地方有一个接缝。这会影响如何在边界面上估计表面法线。

    如果您检查mesh.extract_feature_edges(boundary_edges=True, non_manifold_edges=True, feature_edges=False, manifold_edges=False).plot(),您可能会在伪影发生的地方看到一个垂直环。根据您的网格,使用较小的 tolerance 值调用 mesh = mesh.clean() 可能就足够了,因为如果您在接缝处的点正确重叠,那么这可以合并您的边界点并融合您的边界面以移除虚假边缘。 (您可能还必须自己重新计算法线,但可能不需要;我不完全确定。)

    恰当的例子:这是一个使用挤压多边形的具体示例(这就是您的网格看起来的样子,或者足够接近):

    import pyvista as pv
    
    # generate toroid
    square = pv.Polygon(n_sides=4).translate((0, -2, 0))
    toroid = square.extrude_rotate(resolution=8, rotation_axis=(1, 0, 0), capping=False)
    
    # let's see what we've got
    plotter = pv.Plotter()
    plotter.add_mesh(toroid, color='lightblue', smooth_shading=True)
    plotter.view_yz()
    plotter.show()
    

    从阴影中可以明显看出有些不对劲。这是隐藏的边界边缘:

    print(toroid.n_open_edges)
    # 8
    open_edges = toroid.extract_feature_edges(
        boundary_edges=True,
        non_manifold_edges=True,
        feature_edges=False,
        manifold_edges=False,
    )
    
    plotter = pv.Plotter()
    plotter.add_mesh(toroid, color='lightblue', smooth_shading=True)
    plotter.add_mesh(open_edges, color='red', line_width=5, render_lines_as_tubes=True)
    plotter.view_yz()
    plotter.show()
    

    并以较小的公差进行清理(以允许浮点错误)解决了这个问题:

    cleaned = toroid.clean(tolerance=1e-12)
    print(cleaned.n_open_edges)
    # 0
    
    plotter = pv.Plotter()
    plotter.add_mesh(cleaned, color='lightblue', smooth_shading=True)
    plotter.view_yz()
    plotter.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-15
      • 2015-04-19
      • 2021-11-10
      • 2017-07-24
      • 1970-01-01
      • 2015-03-03
      • 2013-01-30
      • 2018-11-11
      相关资源
      最近更新 更多