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

2024-09-28 01:33:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我从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文件的外观如下所示

enter image description here

这种外观不是我想要的,因为即使在同一个完整平面上,它也会显示许多边

如果设置为drawEdges=False,则显示为

enter image description here

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

我想要的是这样

enter image description here

这是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)

Tags: 程序truedocumentreadercolor外观pyqtgraphactor
1条回答
网友
1楼 · 发布于 2024-09-28 01:33:31

通过指定着色器,可以基于法向量更改曲面的颜色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

我希望你会觉得它有用

相关问题 更多 >

    热门问题