标签: vtk

如何用VTK存储矢量场?C++、VTKWriter

假设我有一个向量场 u,其分量为 ux、uy 和 uz,定义在空间 rx、ry 和 rz 中的(非结构化)位置。

我想要的只是用 VTK 格式存储这个向量场,即用 libvtk 中的“vtkwriter”类来存储 Paraview 的可视化。

我认为我得到了正确合并位置的代码,但不知何故我无法弄清楚如何合并数据:

#include <vtkPoints.h>
#include <vtkPolyDataWriter.h>
#include <vtkSmartPointer.h>

void write_file (double* rx, double* ry, double* rz,
                 double* ux, double* uy, double* uz,
                 int n, const char* filename)
{
    vtkSmartPointer<vtkPoints> points =
        vtkSmartPointer<vtkPoints>::New ();

    points->SetNumberOfPoints(n);

    for (int i = 0; i < n; ++i) {
        points->SetPoint(i, rx[i], ry[i], rz[i]);
    }

    // how to incorporate the vector field u?

    vtkSmartPointer<vtkPolyDataWriter> writer =
        vtkSmartPointer<vtkPolyDataWriter>::New ();

    writer->setFileName (filename);

    // …
Run Code Online (Sandbox Code Playgroud)

c++ vtk

5
推荐指数
1
解决办法
2637
查看次数

从mayavi或vtk导入mlab:内核死了

我已经尝试安装mayavi好几天了,但没有结果。我正在使用spyder和anaconda。我可以在spyder上导入mayavi,没有问题,但是当我尝试导入vtk或from mayavi import mlab时,内核死了。我读了很多关于这个主题的文章,但没有找到有效的解决方案。我尝试了所有后端(在线、Qt4 和 Qt5),但没有结果。我对 Python 还很陌生,所以我不太确定我是否正确完成了所有安装。

要安装 mayavi 我使用:

$conda config --add channels conda-forge

$conda install mayavi

我也尝试使用 $ pip install mayavi ,但遇到另一个无法解决的错误:命令“python setup.py Egg_info”失败,错误代码为1。(我也尝试解决该问题,但没有执行所有建议的更新)

我尝试这些测试:

$nosetests -v tvtk/tests 错误:失败:OSError

$nosetests -v mayavi 好的


系统信息(Windows 10)

  • 蟒蛇5.2.0
  • 康达4.5.7
  • 玛雅维 4.6.1
  • PyQt5 5.11.2
  • 蟒蛇3.6.5
  • 间谍3.2.8
  • vtk 8.1.0

如果有人有解决方案那就太好了!

kernel vtk mayavi anaconda mayavi.mlab

5
推荐指数
0
解决办法
573
查看次数

球体上的纹理错误

我有一些球形经度/纬度坐标,用于我需要可视化的球体上的点.为此,我将点转换为笛卡尔坐标并构建了一个三角形网格,我可以使用VTK进行渲染.到目前为止工作.

现在我想为球体模型使用纹理.因此,我将球面坐标转换为纹理坐标,并将它们分配给每个点.这适用于球体的大多数表面三角形,结果看起来可以接受.

但是,对于纹理包裹的本初子午线的另一侧的三角形,三角形的纹理不正确:不是重复纹理和"在纹理边界上"的映射,整个纹理被挤压到单个三角形上.

这是一张它的样子:

球纹理

zick-zack线显然是错误的,蓝线应该是可见的.整个纹理映射在三角形上,产生红色和白色条纹.这是有道理的,因为对于所讨论的三角形,纹理坐标跨越整个纹理空间.

为了说明这个问题,这不是特定于球体而是所有封闭的物体,我创建了下图:

纹理缝

在上部矩形中,我们看到一个三角形跨越纹理边界,带有计算纹理坐标A,B和C.由于纹理可以平铺,这就是我想要渲染三角形的方式.

下三角显示当前如何解释纹理坐标.边A,B和C的坐标是相同的,但这次,大部分纹理用于三角形,而不是在边界处平铺纹理.

我确信我犯了一个很常见的错误,但我还没有找到任何帮助我的东西.对我有任何暗示吗?

3d geometry textures vtk

4
推荐指数
1
解决办法
2557
查看次数

在mex下编译vtk示例时找不到GLIBCXX

我一直在尝试按照这个例子在Ubuntu 11.10上使用mex在MATLAB中编译vtk.我使用的mex命令如下:

mex -I/usr/include/vtk-5.6 vtk_file.cpp -L/usr/lib/ -lvtkFiltering -lvtkRendering -lvtkCommon
Run Code Online (Sandbox Code Playgroud)

编译后我有一个.mexa64文件.

但是,当我尝试运行该文件时,我最终得到以下错误:

Invalid MEX-file '/home/bill/Documents/MATLAB/vtk/vtk_file.mexa64': 
/usr/local/MATLAB/R2011b/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6:
version `GLIBCXX_3.4.11' not found (required by /usr/lib/libvtkFiltering.so.5.6)
Run Code Online (Sandbox Code Playgroud)

我怎样才能确保找到glibcxx?我原以为它会默认包含在编译中.

c++ glibc mex vtk

4
推荐指数
1
解决办法
1460
查看次数

如何获取点数据的边界框?

如何获取数据集的范围?也称为数据的边界框.用数据读取数据StructuredPointsReader.

vtk

4
推荐指数
1
解决办法
2074
查看次数

使用QVTK在Qt中进行PCL可视化

我是Qt编程的新手,我正在尝试在Qt Widget中可视化来自PCL的点云.我试图使用这种方法:https://stackoverflow.com/a/11939703/2339680,或(类似):http://www.pcl-users.org/QT-PCLVisualizer-mostly-working-td3285187.html.

我得到编译错误:"尝试在我的QVTKWidget中设置渲染窗口时,从类型'vtkObjectBase*const'中无效static_cast到'vtkRenderWindow*''.

作为参考,我已经包含了下面第二个来源的代码,它会重现错误.

#include <pcl/sample_consensus/sac_model_plane.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/common/common.h>
#include <QVTKWidget.h>

int main(int argc, char** argv)
{
  QApplication app(argc, argv);

  QVTKWidget widget;
  widget.resize(512, 256);

  //
  {
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_xyz (new pcl::PointCloud<pcl::PointXYZ>);
    {

      for (float y = -0.5f; y <= 0.5f; y += 0.01f)
      {
        for (float z = -0.5f; z <= 0.5f; z += 0.01f)
        {
          pcl::PointXYZ point;
          point.x = 2.0f - y;
          point.y = y;
          point.z = z;
          cloud_xyz->points.push_back (point);
        } …
Run Code Online (Sandbox Code Playgroud)

c++ qt vtk point-cloud-library

4
推荐指数
1
解决办法
2878
查看次数

在Visualization Toolkit中,哪些类型的对象需要调用Update()和Modified()以及何时调用?

我正在看一些可能无法正常工作的VTK代码.这是一个片段:

vtkSmartPointer<vtkCamera> cam = vtkSmartPointer<vtkCamera>::New();
cam->SetFocalPoint(0, 0, 0);
cam->SetViewUp(perp[0], perp[1], perp[2]);

cam->SetPosition(first_cam_pos);
cam->SetViewAngle(20);
cam->Modified();
Run Code Online (Sandbox Code Playgroud)

在我看来,呼叫Modified()是不必要的,调用四个Set功能应该自动发出相机已被修改的信号.

实际上,Kitware VTK相机示例不适Modified()用于相机.

vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
camera->SetPosition(0, 0, 20);
camera->SetFocalPoint(0, 0, 0);

// Create a renderer, render window, and interactor
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();

renderer->SetActiveCamera(camera);
Run Code Online (Sandbox Code Playgroud)

在其他情况下,我正在查看的可能无法工作的VTK代码Update()用于手动更新 - 不是用于相机对象,而是用于其他地方.我再次认为这可能不是必要的; 但显然Update()并且Modified()出于某种原因存在.

有一些规则来确定何时Modified()Update()需要被调用,当他们不这样做?是否有某些类型的对象需要它们而某些类型的对象不需要它们?或者它与调用它们的函数类型有关?

我正在使用VTK 6.1,但如果这里有一些历史背景,我很乐意得到一般答案.

vtk

4
推荐指数
1
解决办法
1615
查看次数

使用vtk()加载nifti图像

我正在尝试使用python在vtk中加载NIFTI图像.数据已经使用nibabel加载了,我可以使用pyplot对其进行可视化(每个绘图1个切片,我的数据是ndarray).但是我想加载它有一个ImagePlaneWidget ...就像这样.

在此输入图像描述

我无法加载像imageplanewidget想要的数据(vtkDataSet)......我怎么能这样做?

import nibabel as nib
import matplotlib.pyplot as plt
import vtk

img = nib.load('image.nii.gz')
img_data = img.get_data()
print img_data.shape

def show_slices(slices):
    fig,axes = plt.subplots(1, len(slices))
    for i, slice in enumerate(slices):
        axes[i].imshow(slice.T, cmap="gray", origin="lower")

slice_0=img_data[100, :, :]
slice_1=img_data[:, 100, :]
slice_2=img_data[:, :, 100]
show_slices([slice_0, slice_1, slice_2])
plt.suptitle("Image")
plt.show()

plane = vtk.vtkImagePlaneWidget()
plane.SetInputData(img_data)
Run Code Online (Sandbox Code Playgroud)

非常感谢,我是python和vtk的新手

python vtk

4
推荐指数
2
解决办法
2834
查看次数

如何在ParaView中为一系列旧版VTK文件设置自定义时间步长值?

我的序列遗留VTK文件,例如:file_0.vtkfile_1.vtkfile_2.vtk,我可以在的Paraview作为时间序列(打开这里所描述)为file_..vtk,和文件的顺序可以查看和使用时间控制动画。我目前正在使用ParaView 4.4.0。

旧版VTK文件如下所示,其中timestep值存储在标题(第二行)中:

# vtk DataFile Version 3.0
vtk output: file at time       0.0    
ASCII
...
Run Code Online (Sandbox Code Playgroud)

但是,在ParaView中,时间步长值假定与索引相同,即索引0为时间0.0,索引1为时间1.0,索引2为时间2.0。并且添加AnnotateTime筛选器还会显示这些时间步长作为时间步长索引。

但是,我的文件使用可变的时间步长,如每个文件的标题中所述。(我认为传统的VTK格式无法指定这些值)。我已经查看了ParaView的应用程序,以查看是否可以导入或修改这些值,但找不到。

使用内置的Python Shell,这是我用LegacyVTKReader创建对象的不幸尝试:

files = ['file_0.vtk', 'file_1.vtk', 'file_2.vtk']
times = [0.0, 0.022608, 0.73781]
# First attempt
r = LegacyVTKReader(FileNames=files, TimestepValues=times)
print(r.TimestepValues)  # [0.0, 1.0, 2.0]

# Second attempt to try and fix it
r.TimestepValues = times
print(r.TimestepValues)  # [0.0, 0.022608, 0.73781]

Show(r)
Run Code Online (Sandbox Code Playgroud)

在我添加一个AnnotateTimeFilter之前,它将在对象“ Information”对话框中正确显示,将AnnotateTimeFilter重置为0到0、1到1和2到2。

是否可以使用鼠标单击或Python更新ParaView中旧VTK对象的每个索引的时间步值?

python time-series vtk paraview

4
推荐指数
1
解决办法
2476
查看次数

Mayavi中的基本3D体素网格

我正试图通过Python中的Mayavi可视化3D数组.我只是想创建一个结构化的3D体素网格,在其中我可以显示一些预先指定的体素空间填充点.我不认为我想要

我能发现的唯一一个相对相关的例子就是这个MRI例子.我可以使用以下代码来获得一个可行的示例:

import numpy as np
from mayavi import mlab

data = (100, 100, 100)
data = np.zeros(data)
data[0:50, 50:70, 0:50] = 1
data[0:50, 0:20, 0:50] = 1

src = mlab.pipeline.scalar_field(data)
outer = mlab.pipeline.iso_surface(src)

mlab.show()
Run Code Online (Sandbox Code Playgroud)

这可以生成以下图像: 在此输入图像描述 在此输入图像描述 如您所见,即使这些点与生成的框的边具有相同的值,也不会生成框的所有边.

有没有办法可视化numpy数组中值等于1的每一个点?如果没有等表面可视化,我很好 - 事实上,我更喜欢一些Minecraft-esque块状体素可视化.

python 3d graphics vtk mayavi

4
推荐指数
1
解决办法
3399
查看次数