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
希望你会觉得它有用。
我从 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
希望你会觉得它有用。