VTK三角面片显示

来源:互联网 发布:python 决策树实现 编辑:程序博客网 时间:2024/04/29 20:39

TK

第三篇之菜鸟入门

——

SPHERE

VTK

自带的球型的三角面片显示

 

 

VTK

自带了很多的用来表示常见形状的类。这些东西虽然简单但是还是很有用的,毕竟是基础

嘛。废话不多说了,直接说说代码吧。下面的代码来自

C3P

论坛,作者是谁,惭愧,又忘了,

在这里致歉并感谢作者。

 

在计算机里面,

尤其是显示立体的东西,

貌似都比较喜欢用三角形来作为最基本的元素,

其中的

道理我现在不懂,可能是三个点决定一个面吧。所以

VTK

里面的这个球体,貌似也是由三角形

所组成的。

 

1.

还是先把前面的这些库贴上吧,

CTRL+C

CTRL+V

的时候还是很有用的。

 

#include 

"vtkRenderer.h"

 

#include 

"vtkRenderWindow.h"

 

#include 

"vtkRenderWindowInteractor.h"

 

#include 

"vtkSphereSource.h"

 

#include 

"vtkShrinkFilter.h"

 

#include 

"vtkElevationFilter.h"

 

#include 

"vtkDataSetMapper.h"

 

#include 

"vtkActor.h"

 

#include 

"vtkCullerCollection.h"

 

 

void

 main( 

int

 argc, 

char

 *argv[] ) 

复制代码

 

  

2.OK

,下面还是

vtkRenderer

vtkRenderWindow

vtkRenderWindowInteractor

这三

个类的创建和部分初始化,这个貌似是比较固定的。这三个类看上去就是一环套一环的样子。

 

    vtkRenderer *renderer = vtkRenderer::New(); 

        renderer->GetCullers()->RemoveAllItems(); 

    vtkRenderWindow *renWin = vtkRenderWindow::New(); 

        renWin->AddRenderer(renderer); 

    vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); 

        iren->SetRenderWindow(renWin); 

复制代码

 

3.

创建个

sphere

的实例,并且以经纬度的方式各分成

12

份。

 

    vtkSphereSource *sphere = vtkSphereSource::New(); 

        sphere->SetThetaResolution(

12

); sphere->SetPhiResolution(

12

); 

复制代码

 

4.

上面这些都是一些比较固定的东西,

或者说理解起来很容易,

一看就能明白的东西。

下面开始

说些新东西吧。

 

    vtkShrinkFilter *shrink = vtkShrinkFilter::New(); 

        shrink->SetInput((vtkDataSet *)sphere->GetOutput()); 

        shrink->SetShrinkFactor(

0.9

); 

 

    vtkElevationFilter *colorIt = vtkElevationFilter::New(); 

        colorIt->SetInput((vtkDataSet *)shrink->GetOutput()); 

        colorIt->SetLowPoint(

0

,

0

,-

0.5

); 

        colorIt->SetHighPoint(

0

,

0

,

0.5

); 

复制代码

 

其实嘛,这里就是多了两个类而已,一个是

vtkShrinkFilter

,另一个是

vtkElevationFilter

稍微解释一个这两个类,就能明白这几行代码是什么意思了。

 

vtkShrinkFilter

貌似这个类的作用就是用来缩小一个

vtkDataSet

这种数据类型表示的对象

的,比如在这里应该就是缩小组成球面的三角形。

 

shrink cells composing an arbitrary data set 

 

vtkShrinkFilter

 shrinks cells composing an arbitrary data set towards their centroid. 

The centroid of a cell is computed as the average position of the cell points. 

Shrinking results in disconnecting the cells from one another. The output of this 

filter is of general dataset type 

vtkUnstructuredGrid

.

 

virtual

 

void

 vtkShrinkFilter::SetShrinkFactor  ( 

double

    )  [

virtual

]  

 

Get/Set the fraction of shrink 

for

 each cell. The 

default

 

is

 

0.5

.  

复制代码

 

 

vtkElevationFilter

在这里作用貌似是把输入数据的值转化之后限定在某一个数据段之中。这

里的和这个类有关的三句代码的作用,就是让

RGB

的值从

LowPoint

HighPoint

进行变化,

就是沿着

R->G->B

这样的顺序进行变化。

 

(generate scalars along a specified direction 

 

vtkElevationFilter

 is a filter to generate scalar values from a dataset. The scalar 

values lie within a user specified range, and are generated by computing a 

projection of each dataset point onto a line. The line can be oriented arbitrarily. A 

typical example is to generate scalars based on elevation or height above a plane.) 

5.

现在,程序其实可以按照很死板的顺序结束了。

Mapper

Actor

类,这是必须的,当然,

Actor

类有可以代替的类,但是那也是类似的。

 

    vtkDataSetMapper *mapper = vtkDataSetMapper::New(); 

        mapper->SetInput(colorIt->GetOutput()); 

 

    vtkActor *actor = vtkActor::New(); 

        actor->SetMapper(mapper); 

复制代码

 

6.

收尾。

 

    renderer->AddActor(actor); 

    renderer->SetBackground(

1

,

1

,

1

); 

    renWin->SetSize(

400

,

400

); 

   

    renWin->Render(); 

// execute first time 

 

 

    // interact with data 

    iren->Start(); 

 

    

// Clean up 

    renderer->Delete(); 

    renWin->Delete(); 

    iren->Delete(); 

    sphere->Delete(); 

    shrink->Delete(); 

    colorIt->Delete(); 

    mapper->Delete(); 

    actor->Delete(); 

复制代码

 

 

好了,可以运行上图了。

 

 

  

总结,虽然这个程序很简单,但是还是有些疑问,

那就是

sphere

这个类里面的数据时怎么存储

的,

vtkShrinkFilter

获取了它的数据之后又做了什么处理

 

 

GetOut

这个方法在各个类中又是否进行过重载呢,还是简单的继承,他传入的参数一直是

vtkDataSet

类型的。对于

VTK

内部的数据结构依然是很不解,还望高手指点,在哪里可以找

到这些数据结构的说明。


0 0
原创粉丝点击