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网格线的主要内容,如果未能解决你的问题,请参考以下文章

在 PyQT5 窗口中嵌入 VTK 对象

100个 Unity实用技能 | Scene视图选择对象是否边缘高亮显示网格线

使用 Collider Unity 将线渲染转换为 3d 网格

求教VTK窗口渲染问题

DirectX11 非实体线框

vtk-py求3d模型表面积