假设我有一个向量场 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) 我已经尝试安装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 好的
如果有人有解决方案那就太好了!
我有一些球形经度/纬度坐标,用于我需要可视化的球体上的点.为此,我将点转换为笛卡尔坐标并构建了一个三角形网格,我可以使用VTK进行渲染.到目前为止工作.
现在我想为球体模型使用纹理.因此,我将球面坐标转换为纹理坐标,并将它们分配给每个点.这适用于球体的大多数表面三角形,结果看起来可以接受.
但是,对于纹理包裹的本初子午线的另一侧的三角形,三角形的纹理不正确:不是重复纹理和"在纹理边界上"的映射,整个纹理被挤压到单个三角形上.
这是一张它的样子:

zick-zack线显然是错误的,蓝线应该是可见的.整个纹理映射在三角形上,产生红色和白色条纹.这是有道理的,因为对于所讨论的三角形,纹理坐标跨越整个纹理空间.
为了说明这个问题,这不是特定于球体而是所有封闭的物体,我创建了下图:

在上部矩形中,我们看到一个三角形跨越纹理边界,带有计算纹理坐标A,B和C.由于纹理可以平铺,这就是我想要渲染三角形的方式.
下三角显示当前如何解释纹理坐标.边A,B和C的坐标是相同的,但这次,大部分纹理用于三角形,而不是在边界处平铺纹理.
我确信我犯了一个很常见的错误,但我还没有找到任何帮助我的东西.对我有任何暗示吗?
我一直在尝试按照这个例子在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?我原以为它会默认包含在编译中.
我是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) 我正在看一些可能无法正常工作的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,但如果这里有一些历史背景,我很乐意得到一般答案.
我正在尝试使用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的新手
我的序列遗留VTK文件,例如:file_0.vtk,file_1.vtk,file_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中的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块状体素可视化.