VTK 显示3D网格线
Posted Sam Fang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VTK 显示3D网格线相关的知识,希望对你有一定的参考价值。
在VTK9.1.0在Windows10+VS2019+Qt 5.15.2环境下编译安装的Qt例子中,想显示球体表面的网格线。
通过vtkExtractEdges来实现显示全部网格线
QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat()); vtkNew<vtkRenderer> renderer; vtkNew<vtkNamedColors> colors; vtkNew<vtkSphereSource> sphereSource; //球体 vtkNew<vtkPolyDataMapper> sphereMapper; sphereMapper->SetInputConnection(sphereSource->GetOutputPort()); vtkNew<vtkActor> sphereActor; sphereActor->SetMapper(sphereMapper); sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData()); renderer->AddActor(sphereActor); //网格线 vtkNew<vtkExtractEdges> extractEdges; extractEdges->SetInputConnection(sphereSource->GetOutputPort()); vtkNew<vtkPolyDataMapper> sphereMapper; sphereMapper->SetInputConnection(extractEdges->GetOutputPort()); vtkNew<vtkActor> sphereActor; sphereActor->SetMapper(sphereMapper); sphereActor->GetProperty()->SetColor(colors->GetColor4d("Black").GetData()); renderer->AddActor(sphereActor); renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData()); vtkNew<vtkGenericOpenGLRenderWindow> renderWindow; renderWindow->AddRenderer(renderer); renderWindow->SetWindowName("RenderWindowNoUIFile"); ui.vtk_main->setRenderWindow(renderWindow);
如下图所示:
还可以通过vtkFeatureEdges来显示特定的网格线:
1.边界(boundary):只被一个多边形使用的边,或者直线单元;
2.非流行(non-manifold):被三个以上的多边形共用的边;
3.特征边(feature edges):被两个三角形使用,并且两个三角形之间的夹角大于特征角度(可自行设置此角度);
4.流行边(manifold edges):只被两个多边形使用的边。
在 pyqtgraph 中的图像上显示网格线
【中文标题】在 pyqtgraph 中的图像上显示网格线【英文标题】:Show grid lines over image in pyqtgraph 【发布时间】:2018-03-17 00:04:02 【问题描述】:我正在 pyqtgraph 中绘制图像,我希望能够看到网格线。但是网格线总是绘制在图像下方,因此图像的任何黑色区域都会遮挡网格。这是一个相当简单的例子:
import matplotlib # necessary for interactive plots in pyqtgraph
import pyqtgraph as pg
import numpy as np
n = 100000
sigma_y = 1e-3
sigma_x = 1e-3
x0 = np.matrix([np.random.normal(0, sigma_x, n), np.random.normal(0, sigma_y, n)])
bins = 30
histogram, x_edges, y_edges = np.histogram2d(np.asarray(x0)[0], np.asarray(x0)[1], bins)
x_range = x_edges[-1] - x_edges[0]
y_range = y_edges[-1] - y_edges[0]
imv = pg.ImageView(view=pg.PlotItem())
imv.show()
imv.setPredefinedGradient('thermal')
imv.getView().showGrid(True, True)
imv.setImage(histogram, pos=(x_edges[0], y_edges[0]), scale=(x_range / bins, y_range / bins))
这是我看到的(缩小一点后)。您可以看到图像的黑色区域遮挡了网格线。
编辑:可以在 GUI 中将黑色更改为透明(不是我的首选,但目前还可以),因此您可以看到图像下方的网格。这工作正常,但我无法弄清楚如何在代码中做到这一点。如何从ImageView
中取出查找表进行修改?
【问题讨论】:
色阶由几种颜色之间的渐变组成。这些由颜色条右侧的三角形表示。如果单击底部的黑色三角形,将弹出一个对话框,您可以从中更改该设置点的颜色。将 alpha 分量设置为 0 以使比例的下限和透明。看看这对你有用。我相信它也可以通过编程方式完成。 其实还不错,而且比我预期的要好看。但我仍然希望在图像上方看到一条(微弱的)网格线。 【参考方案1】:这就是我所做的。
glw = pyqtgraph.GraphicsLayoutWidget()
pw = glw.addPlot(0, 0)
# Fix Axes ticks and grid
for key in pw.axes:
ax = pw.getAxis(key)
# Set the grid opacity
if grid_is_visible:
ax.setGrid(grid_opacity * 255)
else:
ax.setGrid(False)
# Fix Z value making the grid on top of the image
ax.setZValue(1)
我认为这确实导致了其他一些问题。它可能是上下文菜单,或者它与平移和缩放有关,因为 Qt 是如何发出事件信号的。一个轴获得事件优先级并阻止事件传播到其他轴以进行平移和缩放。我向 pyqtgraph 提交了一个拉取请求,所以这可能不再是问题了。我不记得是什么导致了这个问题。它可能对你很好。我做了很多其他的事情,比如更改背景颜色和更改视图框背景颜色,这会导致一些小问题。
作为说明,我还更改了图像 z 值。不过你不应该这样做。
imv.setZValue(1)
【讨论】:
是的!这样可行。不过,您对这个问题是正确的(我使用的是 pyqtgraph 0.10.0)。使用网格下方的图像,我只能垂直平移。这可能已经够烦人了,我将把网格留在原来的位置。 我在 pyqtgraph 中进行了修复并提交了一个拉取请求。您可以进入您的站点包 python 文件夹并编辑 pyqtgraph。 github.com/pyqtgraph/pyqtgraph/pull/565 或者,如果你真的需要它,你可以使用我的 pyqtgraph 版本,但我并不总是更新我的版本,你会错过新的东西。pip install git+http://github.com/HashSplat/pyqtgraph@mydevelop
你必须安装 git。
谢谢,是的,我找到了你的 PR。这只是一个装饰性的东西,所以我现在暂且不说,但我会留意你的 PR;如果它被接受,我将使用开发分支。以上是关于VTK 显示3D网格线的主要内容,如果未能解决你的问题,请参考以下文章
100个 Unity实用技能 | Scene视图选择对象是否边缘高亮显示网格线