pyqtgraph显示STL文件时如何隐藏同一完整平面上不需要的线或边

how to hiden the unncessary lines or edges on the same complete plane when pyqtgraph displays a STL file

我从 STLViewer
中找到了一个使用 pyqtgraph 的 STL 查看器程序 pyqtgraph document
关键参数设置为

# color is a tuple in the form RGBA  (0.4,0.9,0.6,1)`
mesh = gl.GLMeshItem(meshdata=meshdata, smooth=True, drawEdges=True, drawFaces=True,  shader='balloon',color= (0.4,0.9,0.6,1))

一个stl文件外观显示如下

这个样子不是我想要的,因为即使在同一个完整的平面上,它也会显示很多边。

如果设置 drawEdges=False 则显示为

然而,我能触摸到的混凝土边缘也被隐藏了,这也不是我想要的。

我想要的是这样的

这是pyVTK画的

主程序是

import vtk
reader = vtk.vtkSTLReader()
reader.SetFileName(filename)
mapper = vtk.vtkPolyDataMapper()  # maps polygonal data to graphics primitives
mapper.SetInputConnection(reader.GetOutputPort())
actor_0 = vtk.vtkLODActor()
actor_0.SetMapper(mapper)
actor_0.SetScale(1000, 1000, 1000)
actor_0.GetProperty().SetDiffuseColor(0.4,0.9,0.6)
actor_0.GetProperty().SetDiffuse(.8)
actor_0.GetProperty().SetSpecular(.5)
actor_0.GetProperty().SetSpecularColor(1.0, 1.0, 1.0)
actor_0.GetProperty().SetSpecularPower(30.0)

您可以通过指定着色器根据法向量改变表面的颜色。 viewNormalColor 似乎符合您在内置着色器中寻找的内容。

Using viewNormalColor shader

mesh = gl.GLMeshItem(meshdata=meshdata, smooth=True, drawFaces=True, drawEdges=False, shader='viewNormalColor', glOptions='opaque')

有一个使用内置着色器的示例代码。 https://github.com/pyqtgraph/pyqtgraph/blob/master/examples/GLshaders.py

但这太华而不实了。所以,我搜索了一下,发现可以添加自定义着色器。

https://github.com/pyqtgraph/pyqtgraph/blob/master/pyqtgraph/opengl/shaders.py

这是添加自定义着色器的代码。我不太了解着色器,但我修改了 viewNormalColor 着色器使表面变绿。

gl.shaders.Shaders.append(gl.shaders.ShaderProgram('myShader', [
    gl.shaders.VertexShader("""
            varying vec3 normal;
            void main() {
                // compute here for use in fragment shader
                normal = normalize(gl_NormalMatrix * gl_Normal);
                gl_FrontColor = gl_Color;
                gl_BackColor = gl_Color;
                gl_Position = ftransform();
            }
        """),
    gl.shaders.FragmentShader("""
            varying vec3 normal;
            void main() {
                vec4 color = gl_Color;
                color.x = 0.0;
                color.y = (normal.y + 1.0) * 0.5;
                color.z = 0.0;
                gl_FragColor = color;
            }
        """)
]))

然后传递着色器名称。

mesh = gl.GLMeshItem(meshdata=meshdata, smooth=True, drawFaces=True,
                         drawEdges=False, shader='myShader', glOptions='opaque')

Using myShader

希望你会觉得它有用。