VTK草稿4

4.2 Using VTK Interactors

  • VTK提供了两种和可视化结果互动的方法:
    • 用系统自带的vtkRenderWindowInteractor
    • 创建自己的Interactor,绑定一些事件在上面
  • 如果是用解释性语言(python, tcl)编写的程序,还可以在运行时敲入命令来交互。

vtkRenderWindowInteractor

  • 最简单的和可视化数据交互的方式就是例化一个vtkRenderWindowInteractor,这个类有一些事先设定好的事件(event)和动作(action),并且可以被override。它可以控制camera和actor,由两种交互风格(interaction style):
    • position sensitive (joystick mode) 操纵杆模式
    • motion sensitive (trackball mode) 轨迹球模式
  • vtkRenderWindowInteractor支持以下事件:
    • j / t : j是切换到joystick mode, t是切换到trackball mode。joystick模式下,鼠标在显示窗口中按住,动作就会持续发生;trackball模式下,鼠标按下并且拖动鼠标,动作才会发生。
    • c / a : c是切换到camera控制,a是切换到actor控制。
    • 鼠标左键:旋转
    • 鼠标中键:拖动
    • 鼠标右键:缩放
    • 3:切换到红蓝3D显示,戴上红蓝眼镜能看到3D效果
    • e:退出程序
    • ffly-to the point under the cursor,个人测试下来觉得是将物体以鼠标当前位置为中心显示出来。
    • p:进行pick操作,vtkRenderWindowInteractor有一个内置的vtkPropPicker成员用来执行pick操作。(pick的含义在后文会解释)
    • rreset,沿着当前的视角方向重置camera视角,将actor放置在中心,重置camera使得所有的actor都能显示出来。
    • s:使所有的actors都以surface的形式显示
    • u:在解释型语言中,按u来输入用户指令。
    • w:使所有的actors都以wireframe的形式显示
wireframe
surface

4.3 Filtering Data

之前的例子都是source object直接连入mapper object,中间没有filters。filters的连接是通过SetInput()GetOutput()方法。
这里举的一个例子就是在之前的例子中加入了一个filter。核心的代码如下:

// set filter
vtkShrinkPolyData shrink  = vtkShrinkPolyData::New();
shrink->SetInput(part->GetOutput());
shrink->SetShrinkFactor(0.85);
// set Mapper
vtkPolyDataMapper partMapper = vtkPolyDataMapper::New();
partMapper->SetInput(shrink->GetOutput());

由于vtk这个例子只有python和tcl的版本,这里我就偷懒直接用python脚本运行了,要用vtk的python wrapper,可以用$VTK_BUILD/bin/vtkpython,在/usr/local/bin中也有vtkpython,但不知道为何显示import vtk失败,可能是环境变量没有配置好,不过在vtk安装目录下的那个是可以用的,运行结果如下:

shrink filter

这个shrink filter的含义从字面上没法理解,有待进一步研究……

4.4 Controlling The Camera

  • 有两种方式来操控camera:
    • 先例化camrea,再设置给renderer
vtkCamera cam1 = vtkCamera::New();
cam1->...  // 设置cam1的属性
vtkRenderer ren1 = vtkRenderer::New();
ren1->SetActiveCamera(cam1);
- 从renderer中得到默认的camera,对其进行属性设置
cam1 = ren1->GetActiveCamera();
cam1->...   // 设置cam1属性
  • camera的属性设置在使用时才有体会,这个在日后的使用中可以逐渐学习。

4.5 Controlling Lights

  • Light比camera更容易控制,常见的几个方法是SetPosition(), SetFocalPoint(), SetColor()。默认情况下,vtkLight是一个平行光源,即光源在无限远的位置,投射在物体上的光线是平行的。
  • 常用的Light设置为headlight,即light和camera的位置、焦点都一致。

4.6 Controlling 3D Props

  • Prop这个词本意是舞台上的道具,在VTK里面引申为显示在窗口中的物体。vtkActorvtkProp3D的一个子类,它的几何构成由多边形和连线确定。

vtkProp3D的位置

  • 我们已经看过如何控制camera来改变物体的显示。同样的,我们可以保持camera不变,直接控制Prop:
    • SetPosition(x, y, z):在世界坐标系(world coordinate)中指定vtkProp3D的位置。
    • AddPosition(x, y, z):Translate the Prop.
    • RotateX(theta), RotateY(theta), RotateZ(theta),绕坐标轴旋转theta角度。
    • SetOrientation(x, y, z):指定Prop的朝向,先调整Z轴,其次X,最后Y轴。
    • AddOrientation(x, y, z):在现有的朝向上增加角度。
    • RotateWXYZ(theta, x, y, z):以指定的xyz向量旋转Prop theta角度。
    • Scale(sx, sy, sz):在xyz轴上调整Prop的大小。
    • SetOrigin(x, y, z):设置Prop的原点,Prop的旋转和放大都是围绕着Origin操作的。
  • 最重要的一点:上述这些操作在VTK中是以一个固定的顺序执行的:

Shift to Origin -> Scale -> Rotate Y -> Rotate X -> Rotate X -> Shift from Origin -> Translate

  • 不同的操作顺序导致的结果会大相径庭。

Actors

  • Actors是最常用的vtkProp3D子类,它把一系列的渲染属性例如表面属性(e.g. 反射光照),表现方式(e.g. surface模式/wireframe模式),材质贴图等集合在一起。(class的作用)
  • 定义Geometry数据来源用SetMapper()方法,之前已经见过多次。Mapper是连接Visualization pipeline和Graphics pipeline的桥梁。
  • vtkProperty的class控制着Actor的属性,和camera一样,可以先例化再赋值(actor->SetProperty(property)),或者先得到再写属性(actor->GetProperty())。
  • 颜色可能是actor最重要的属性。SetColor(doule r, double g, double b),rgb的值都在[0, 1]的范围内。也可以分别设置Ambient/Diffuse/Specular的颜色。
  • Actor的透明度可以设置,尤其在需要看到内部结构的时候有用。actor->GetProperty()->SetOpacity(double opacity);。透明度的渲染是用了α-blending的方法,所以当有多个透明actor时,渲染的顺序尤为重要,最好是把透明的actor放在渲染列表的最后(这一段现在还不是很理解 TODO)

Level-Of-Detail Actors

  • 加入了interactor之后,它会自动控制显示的帧率,在运动时以高帧率/低分辨率显示,在静止时以低帧率/高分辨率显示

Assemblies

  • Actors可以被组合成有层次的集合,当assembly中一个actor运动的时候,其他actor也会随之而动。例如机器人的手臂可能由上臂、小臂、手腕、手构成,他们之间通过joint连接,而上臂绕着肩膀旋转时,下面的部分也应该跟着旋转。这时就可以用到Assembly,它也是vtkActor的一个子类。
cone + cylinder + cube + sphere 构成的 assembly
  • vtkAssembly尽管是vtkActor的子类,但它并没有自身的Property和Mapper,只能设置它的Position信息。因此Assembly内部的元素必须自身包含了各自的属性和连接的Mapper。
  • Assembly可以层级包含,在最后renderer中AddActor()时只需要添加最外围的Assembly,里面的各个元素包括内部的小Assembly会递归渲染。一个actor可以被包含在多个Assembly中,只要不出现自身包含自身的情况即可。

Volumes

  • 回忆上一章中,vtkProp3D主要有两个子类:vtkActorvtkVolumevtkVolume也从vtkProp3D中继承了一系列操作position和orientation的方法,此外,它也有自身的属性设置vtkVolumeProperty。(Volume这个词的含义还需要探究,有些资料里说是“体渲染” TODO) 下面是一个Volume的例子:
SimpleRayCast.py
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容