我正在尝试使用XTK在我的网页上显示3D CFD数据.我可以生成包含我的关注格式指南数据(网格点,速度,压力)ASCII VTK文件,在这里,我可以想像它,它访问.
当我尝试加载到XTK时,(通过更改头骨教程中的文件名)我收到错误:
TypeError : f is null
Run Code Online (Sandbox Code Playgroud)
在xtk.js中,没有显示任何内容.
有人有过类似的问题吗?
这是我的VTK文件示例.
PS我知道Paraview在阅读FieldData时遇到了麻烦,所以我尝试将其删除为XTK,但没有运气.
对于我的增强现实项目,我使用VTK相机观看3D模型,并使用真实相机观看模型的真实对象.
我使用EPnP来估计真实相机的外在矩阵(这个相机已经预先校准,因此我知道内部参数),通过从真实相机图像和内部参数提供来自VTK及其相应2D点的3D点.用于EPnP算法的真实相机.
之后,我获得了一个旋转和平移矩阵,其元素为 - > R1,R2,R3,.....,R9和t1,t2和t3.
所以我的真实相机的外在矩阵看起来像这样(让我们称之为extrinsicReal)
R1 R2 R3 T1
R4 R5 R6 T2
R7 R8 R9 T3
0 0 0 1
Run Code Online (Sandbox Code Playgroud)
在此之后,我使用以下代码估计我的VTK相机的外在矩阵:
vtkSmartPointer<vtkMatrix4x4> extrinsicVTK = vtkSmartPointer<vtkMatrix4x4>::New();
extrinsicVTK->DeepCopy(renderer->GetActiveCamera()->GetViewTransformMatrix());
Run Code Online (Sandbox Code Playgroud)
要将VTK摄像机3D模型与真实摄像机融合,VTK摄像机应设置在与真实摄像机位置相同的位置,并且VTK摄像机的焦距应与真实摄像机的焦距相同.另一个重要步骤是将真实相机的相同外在矩阵应用于VTK相机.我该怎么做?
我做的是我采用extrinsicReal的反转并将其与extrinsicVTK相乘得到一个新的4*4矩阵(让我们称之为newMatrix).我将此矩阵应用于VTK相机的转换.
vtkSmartPointer<vtkMatrix4x4> newMatrix = vtkSmartPointer<vtkMatrix4x4>::New();
vtkMatrix4x4::Multiply4x4(extrinsicRealInvert,extrinsicVTK,newMatrix);
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->SetMatrix(NewM);
transform->Update();
renderer->GetActiveCamera()->ApplyTransform(transform);
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是正确的方法.但是我检查了真实的摄像机位置(我在EPnP之后得到的)和VTK摄像机位置(在应用上面的变换之后)并且它们都完全相同.此外,真实相机的方向和VTK相机的投影方向也是相同的.
问题是即使在上述参数匹配VTK和真实相机之后,3D VTK模型似乎也不能与真实相机视频完美对齐.有人可以指导我一步一步调试问题吗?
我正在开发一个使用自定义子类QOpenGLWidget
来显示一些渲染的项目.在paintGL()
方法结束时,它调用窗口小部件的update()
方法来触发重绘事件(如果它可见).现在我想为QVTKWidget
我的Ui 添加一个额外的东西,我通过使用这样的东西:
QVBoxLayout* layout = findChild<QVBoxLayout*>("layout_simulation");
QVTKWidget* widget = new QVTKWidget();
// Setup arrow
vtkSmartPointer<vtkArrowSource> arrowSource = vtkSmartPointer<vtkArrowSource>::New();
[more VTK stuff...]
widget->GetRenderWindow()->AddRenderer(renderer);
renderer->AddActor(arrowActor);
renderer->ResetCamera();
// Add widget to ui
layout->addWidget(widget);
Run Code Online (Sandbox Code Playgroud)
VTK小部件已添加到ui并按预期工作.问题是,只要我使用该layout->addWidget()
方法,我的所有其他QOpenGLWidget
对象都会变黑并且不显示任何内容.另外这款黑色不是的背景色VTKRenderer
,因为其他部件仍然是黑色的,即使我改变VTK构件的背景颜色.我检查了一下,然后paintGL()
在循环中调用了静止但它只是没有显示任何内容.我很确定我没有在我的widget子类中使用任何不好的OpenGL代码,所以我猜它与QOpenGLWidget
and 的内部初始化有关QVTKWidget
.如果省略所有VTK调用并添加新创建的,则会发生同样的情况QVTKWidget
.
有趣的是,如果我省略了layout->addWidget()
调用,VTK会在一个单独的窗口中打开渲染器,所有OpenGL小部件都可以正常工作.但我当然希望将渲染器嵌入到我的UI中.
有没有人有这方面的经验,或者你知道我可能遇到的任何陷阱,或者是否有任何可能导致此问题的常见问题?
BTW:我使用OpenGL 3.3核心配置文件和我的QOpenGLWidget
子类的自定义着色器.
编辑:我删除了我对3.3核心配置文件的请求,现在它使用4.4兼容性配置文件.我猜它现在使用相同的配置文件,VTKRenderer
所以这可以排除作为错误的来源.
除了Kitware提供的书籍之外,我正在寻找一些可以帮助学习VTK库的资源的链接.优选地,使用示例代码和教程.谷歌的结果对我来说并不是非常有用.所以我在这里要求获得VTK资源的链接.
请考虑以下脚本
import vtk
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
an_actor = vtk.... # create an actor
ren.AddActor(an_actor)
iren.Initialize()
renWin.Render()
iren.Start()
Run Code Online (Sandbox Code Playgroud)
如果脚本在那里结束,一切都会正常,并且当手动关闭窗口(单击X)或按下退出键(Q或E)时,将关闭创建的窗口并释放资源.
但是,如果有更多的语句,你会注意到窗口仍然存在,这是可以理解的,因为我们没有调用任何东西来放弃它,只是结束了交互循环.
通过附加以下内容自行查看:
temp = raw_input('The window did not close, right? (press Enter)')
Run Code Online (Sandbox Code Playgroud)
根据VTK/Examples/Cxx/Visualization/CloseWindow,这个
iren.GetRenderWindow().Finalize() # equivalent: renWin.Finalize()
iren.TerminateApp()
Run Code Online (Sandbox Code Playgroud)
应该完成工作,但事实并非如此.
我还需要做什么才能以编程方式关闭打开的窗口?
在http://www.vtk.org/Wiki/Cocoa_VTK上发布的非常有用的指南以及由VTK回购中的Sean McBride和Mike Jackson 发布的自述文件对于VTK 6.1来说已经过时了.所以,如果这有助于任何人,我发布了在OSX 10.8上安装VTK 6.1的说明,并支持SimpleCocoaVTK Xcode项目.
我使用与Ubuntu包管理器一起安装的python-vtk 6.2.0在python 2.7中编码.我使用eclipse + pydev作为IDE,我可以在shell和Eclipse中成功运行代码.
我唯一烦人的问题是代码分析器不断发布类型的错误:Undefined variable from import: vtkxxxxxx
每当我这样做
import vtk
vtk.vtkTransformPolyDataFilter
vtk.vtkActor
vtk.vtkWhatever
Run Code Online (Sandbox Code Playgroud)
我试图重置解释器,我也尝试手动将库.so文件添加到PYTHONPATH,没有运气.
我也可以在系统库下的项目树中看到vtk包,我没有错误 import vtk
是否有一种特殊的方式在pydev中包含vtk库?我做了一些我看不到的傻事吗?
谢谢你们!
我有一组存储在VTK文件中的数据,它代表一个带有数组中标量点数据的域的切割.我正在尝试生成所述标量的等高线图,使其看起来有点像使用ParaView制作的附图.我宁愿坚持使用vtk库而不是使用其他东西,比如Matplotlib,因为我认为它们会产生更好的可视化效果..
我在网上看过几个例子,但没有一个对我有效(没有错误被抛出,我最终得到的只是背景的空渲染),所有我能做的就是表面图数据(例如:这里).
这是我所拥有的代码的当前版本(非常类似于成功生成曲面图的代码):
# import data
reader = vtk.vtkDataSetReader()
reader.SetFileName('inputDataFiles/k_zCut.vtk')
reader.ReadAllVectorsOn()
reader.ReadAllScalarsOn()
reader.Update()
# access data
data = reader.GetOutput()
d = data.GetPointData()
array=d.GetArray('k')
# create the filter
contours = vtk.vtkContourFilter()
contours.SetInput(reader.GetOutput())
contours.GenerateValues(5,1.,5.)
# create the mapper
mapper = vtk.vtkPolyDataMapper()
mapper.SetInput(contours.GetOutput())
mapper.ScalarVisibilityOff()
mapper.SetScalarRange(1., 5.)
# create the actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)
# create a rendering window and renderer
ren = vtk.vtkRenderer()
ren.SetBackground( 0.329412, 0.34902, 0.427451 ) #Paraview blue
# Assign actor to the renderer
ren.AddActor(actor)
renWin = …
Run Code Online (Sandbox Code Playgroud) 尝试在我写的Python VTK应用程序中运行多个渲染窗口时,我遇到了一些问题.该应用程序尝试在立体应用程序的两个单独视图中呈现3D模型(即左渲染和右渲染),但我遇到同时更新每个窗口的摄像机的问题.我现在有设置了两个几乎相同的管道,每个都有自己的vtkCamera
,vtkRenderWindow
,vtkRenderer
,和vtkRenderWindowInteractor
,在于右照相机在位置上的唯一区别移位30个单元沿X轴.
每个渲染窗口交互器都通过vtkRenderWindowInteractor.AddObserver()
调用简单函数的方法进行更新,以将摄像机重置为其原始位置和方向.最大的问题是,这似乎只出现在一个窗口上,特别是当时关注的窗口.就好像交互器的计时器在交互器失去焦点时关闭一样.此外,当我按住鼠标(并因此移动相机)时,渲染的图像开始"漂移",重置为越来越不正确的位置,即使我已将坐标硬编码到函数中.
显然我对VTK很新,而且很多事情都是相当令人困惑的,因为后端隐藏了很多东西,所以在这个问题上获得一些帮助会很神奇.我的代码如下.多谢你们!
from vtk import*
from parse import *
import os
import time, signal, threading
def ParseSIG(signum, stack):
print signum
return
class vtkGyroCallback():
def __init__(self):
pass
def execute(self, obj, event):
#Modified segment to accept input for leftCam position
gyro = (raw_input())
xyz = parse("{} {} {}", gyro)
#This still prints every 100ms, but camera doesn't update!
print xyz
#These arguments are updated and the call is made.
self.leftCam.SetPosition(float(xyz[0]), …
Run Code Online (Sandbox Code Playgroud) 我是新来的Javascript
,并NRRD Loader
在nrrd装载机,我们可以使用滑块更改切片的索引值
sliceY = volume.extractSlice('y', Math.floor(volume.RASDimensions[1]/2));
scene3.add(sliceY.mesh);
gui.add(sliceY, 'index', 0, volume.RASDimensions[1], 1).name('indexY').onChange(function () {
sliceY.repaint.call(sliceY);
});
Run Code Online (Sandbox Code Playgroud)
考虑我需要使用相同的滑块同时更新slicesX的值
sliceX = volume.extractSlice('x', Math.floor(volume.RASDimensions[1]/2));
Run Code Online (Sandbox Code Playgroud)