VTK中获取STL模型点的坐标以及对其进行变换
VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG、OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的东西,如地质构造、地层分布、矿床分布、三维空间应力场的状态变化等等,而OSG、OGRE是基于场景的可视化,更强调视觉感官的感受,所以OSG主要应用于虚拟现实领域,而VTK主要应用于科学计算可视化领域。
VTK的可视化设计是基于管线流的设计模式,将要处理的数据作为流动介质在管线中流动,不同的阶段对数据有不同的处理方式,VTK的可视化管线如图所示:
Sources: 数据生成的源头,数据来源主要包括从磁盘读取数据文件,如VTK所支持的各种格式文件生成数据源对象,这种源对象被称为读源对象,或者利用数学方法生成源对象,如利用多个四边形构建一个圆柱体,这种对象被称为程序源对象。
Filters: 对源对象进行处理,生成新的数据集输出。
Mappers: 映射器对象主要作用是将可视化模型生成的数据转换到图形模型进行绘制,或者以磁盘文件的形式进行输出。
渲染对象(vtkRenderer)和渲染窗口(vtkRenderWindow): 渲染对象和渲染窗口分别对应于用于显示图形的视口和窗口。每个渲染窗口可以容纳一个或多个渲染对象。即一个渲染窗口中可以存在多个视口,它们既可以并列也可以分层排放。
如下图所示,用vtkSTLReader读入一个边长为50mm的立方体模型(注意模型不在原点--导出STL文件时选择了自定义的坐标系)。如果是ASCII格式的STL文件可以直接用文本编辑器打开查看立方体各顶点的坐标,在VTK中如何获得这些顶点的坐标位置呢?vtkProp3D类里面有几个函数:GetPosition、GetOrigin、GetCenter不过这些都没办法获取立方体顶点的坐标。不管立方体在坐标系中处于什么位置,只要没调用SetPosition设置新位置,GetPosition都会返回(0, 0, 0)。
import vtk # Create the reader and read a data file.
sr = vtk.vtkSTLReader()
sr.SetFileName("cube.stl")
sr.Update() stlMapper = vtk.vtkPolyDataMapper()
stlMapper.SetInputConnection(sr.GetOutputPort()) stlActor = vtk.vtkLODActor()
stlActor.SetMapper(stlMapper)
#stlActor.SetPosition(-50, 0, 0) p = [0, 0, 0]
polydata = sr.GetOutput()
for i in range(polydata.GetNumberOfPoints()):
polydata.GetPoint(i, p);
print p # Create the Renderer, RenderWindow, and RenderWindowInteractor
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin) # Add the actors to the render; set the background and size
ren.AddActor(stlActor)
ren.SetBackground(0.1, 0.1, 0.1)
renWin.SetSize(500, 500) # create coordinate axes in the render window
axes = vtk.vtkAxesActor()
axes.SetTotalLength(100, 100, 100) # Set the total length of the axes in 3 dimensions
# Set the type of the shaft to a cylinder:0, line:1, or user defined geometry.
axes.SetShaftType(0)
axes.SetCylinderRadius(0.02)
axes.SetAxisLabels(0)
ren.AddActor(axes) style = vtk.vtkInteractorStyleTrackballCamera()
style.SetDefaultRenderer(ren)
iren.SetInteractorStyle(style) iren.Initialize()
renWin.Render()
iren.Start()
运行后得到如下结果,即立方体8个顶点的实际坐标:
[50.0, 0.0, 100.0]
[50.0, 100.0, 100.0]
[50.0, 0.0, 0.0]
[50.0, 100.0, 0.0]
[150.0, 0.0, 100.0]
[150.0, 0.0, 0.0]
[150.0, 100.0, 100.0]
[150.0, 100.0, 0.0]
如果将注释"#stlActor.SetPosition(-50, 0, 0)"取消,再运行会得到同样的结果。可以发现SetPosition这种操作并不会影响顶点的实际位置,只能控制场景中的演员的位置。vtkActor.SetPosition() simply effects where your actor is rendered, but do not modify any coordinates of the underlying polydata physically. 即VTK中的变换可分为对实际数据的变换和对演员的变换,具体可以参考PPT:Introduction to VTK: Transforms
为了对原始数据进行处理可以添加filter,如下面代码,将原始STL模型中的顶点向X轴负方向平移50mm
transform = vtk.vtkTransform()
transform.Translate(-50, 0, 0)
transformFilter = vtk.vtkTransformPolyDataFilter()
transformFilter.SetInputConnection(sr.GetOutputPort())
transformFilter.SetTransform(transform)
transformFilter.Update()
再次查询立方体的顶点,坐标如下:
[0.0, 100.0, 100.0]
[0.0, 0.0, 0.0]
[0.0, 100.0, 0.0]
[100.0, 0.0, 100.0]
[100.0, 0.0, 0.0]
[100.0, 100.0, 100.0]
[100.0, 100.0, 0.0]
另外需要注意的是可视化管道使用惰性计算策略(lazy evaluation scheme): 直到需要数据(或被强制)时,可视化管道才会产生数据,产生的数据是最新的。对数据的需求由Update()方法提出,这一方法可以显示调用,也可以由图形流水线中演员对象(Actor)的Render()方法自动调用。对数据的需求会逆着流水线的方向传递,如果某一部分的数据过时(通过检查时间标签),可视化流水线中的过滤器会重新执行,最新生成的数据沿着流水线传递给演员(Actor)。
在上面的代码中如果实例化vtkSTLReader后,直接调用GetNumberOfPoints方法获取STL模型顶点的数目,会返回0,尽管这个模型包含了8个顶点。出现这样的原因是因为GetNumberOfPoints()方法没有被要求执行,而使用Update()方法强制了流水线的执行,因此会返回8。
参考:
VTK/Examples/Cxx/PolyData/PolyDataGetPoint
Visualization Toolkit ( VTK ) Tutorial
Introduction to VTK: Transforms
how to get the world coordinate of a Prop?
what's the difference between actor 's position and sphere 's center ?
VTK中获取STL模型点的坐标以及对其进行变换的更多相关文章
- jQuery中获取相对文档的坐标的方法是什么?
offset(),获取匹配元素在当前视口的相对偏移.返回的对象包含两个整型属性:top 和 left,以像素计.此方法只对可见元素有效. position()获取匹配元素相对定位父级的偏移.没有定位父 ...
- VTK中导入并显示STL、3DS文件
VTK(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和科学计算可视化.VTK是在三维函数库OpenGL 的基础上采用面向对象的设计方法发展起 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (40) ------ 第七章 使用对象服务之从跟踪器中获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读)
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 7-5 从跟踪器中获取实体 问题 你想创建一个扩展方法,从跟踪器中获取实体,用于数 ...
- ionic中获取坐标方法
ionic中获取坐标的方法 1.首相需要执行命令: cordova plugin add cordova-plugin-geolocation2.然后块级注入配置bower文件引入ngCordova ...
- 37 VTK中的坐标系系统
0 引言 在利用PCL的交互功能解决尺寸关联几何的指定问题时,涉及到一些显示上的操作.目前的需求是:将投影到注释平面上的点云,以与屏幕平齐的方式,显示在屏幕正中,这样方便用户进行操作.但是,在运用se ...
- 机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集
机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集 选自Microsoft www.tz365.Cn 作者:Lee Scott 机器之心编译 参与:李亚洲.吴攀. ...
- VTK中的装配体(vtkAssembly)
Actors有时也会组合在一起形成层次结构,当其中的某个Actor运动时,会影响到其他Actor的位置.例如,一个机械手臂可能由上臂.前臂.手腕和末端等部分通过关节连接起来.当上臂绕着肩关节旋转时,我 ...
- 整理下PC和移动获取点击、移动坐标的代码和坑
一.PC PC是通过鼠标点击和移动,相对比较简单,比如onmousedown.onmouseup.onmousemove.onmouseout鼠标按键按下.按键起来.鼠标在元素上移动.鼠标从元素上离开 ...
- android 中获取当前焦点所在屏幕中的位置 view.getLocationOnScreen(location)
final int[] location = new int[2]; view.getLocationOnScreen(location); final int[] location = new in ...
随机推荐
- MAPI错误0x80040107
MAPI错误0x80040107 的解决方案: The MAPI error means there's an "invalid entry" within the contac ...
- javascript中使用new与不使用实例化对象的区别
我们先来看个实例 function Me(name,age,job){ this.name = name; this.age = age; this.job = job; } 请问这以下两种实例化对象 ...
- 样条之埃特金(Aitken)逐步插值函数
核心代码: ////////////////////////////////////////////////////////////////////// // 埃特金逐步插值 //////////// ...
- 【转】 Qt如何设置自动补全快捷键
原文:https://blog.csdn.net/u014597198/article/details/52797435 在用Qt编程的时,它默认是以“CTRL+空格”来作为自动补全的快捷键的,但是这 ...
- 有序数组每个数平方后,不同数字的个数?O(n)
此乃一道笔试题,当时的确也做出来啦.(但是在细节上还是出错啦,对多次重复出现的数字可能会重复计数,没有记录上次删除的元素) 如题,有序数组,可以知道平方之后在两边的数据较大,中间的数据较小. 因此可以 ...
- window.open 浏览器差异.
首先引入 w3help的,莫的测试: 原帖地址:http://www.w3help.org/zh-cn/causes/BX1053 w3help的测试,和我的测试相互补充,应该比较完整了.悲剧的是 ...
- iOS开发-View中frame和bounds区别
开发中调整View的时候的经常会遇到frame和bounds,刚开始看的时候不是很清楚,不过看了一下官方文档,frame是确定视图在父视图中的位置,和本身的大小,bounds确定可以确定子视图在当前视 ...
- printf()详解之终极无惑
1.printf()简介 printf()是C语言标准库函数,用于将格式化后的字符串输出到标准输出.标准输出,即标准输出文件,对应终端的屏幕.printf()申明于头文件stdio.h. 函数原型: ...
- MFC中打印对话框CPrintDialog类
void CCPrintDialogView::OnPrint() { DWORD dwflags=PD_ALLPAGES|PD_NOPAGENUMS|PD_USEDEVMODECOPIES|PD_S ...
- FastDFS tracker storage 的工作原理及流程
FastDFS tracker storage 的工作原理及流程 2013 年 3 月 11 日 – 09:22 | 1,409 views | 收藏 (No Ratings Yet) FastDF ...