VTK自带了很多的用来表示常见形状的类。这些东西虽然简单但是还是很有用的,毕竟是基础嘛。废话不多说了,直接说说代码吧。下面的代码来自C3P论坛,作者是谁,惭愧,又忘了,在这里致歉并感谢作者。
在计算机里面,尤其是显示立体的东西,貌似都比较喜欢用三角形来作为最基本的元素,其中的道理我现在不懂,可能是三个点决定一个面吧。所以VTK里面的这个球体,貌似也是由三角形所组成的。
1.还是先把前面的这些库贴上吧,CTRL+C、CTRL+V的时候还是很有用的。
#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这三个类的创建和部分初始化,这个貌似是比较固定的。这三个类看上去就是一环套一环的样子。
renderer -> GetCullers() -> RemoveAllItems();
vtkRenderWindow * renWin = vtkRenderWindow::New();
renWin -> AddRenderer(renderer);
vtkRenderWindowInteractor * iren = vtkRenderWindowInteractor::New();
iren -> SetRenderWindow(renWin);
3.创建个sphere的实例,并且以经纬度的方式各分成12份。
sphere -> SetThetaResolution( 12 ); sphere -> SetPhiResolution( 12 );
4.上面这些都是一些比较固定的东西,或者说理解起来很容易,一看就能明白的东西。下面开始说些新东西吧。
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.)
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类有可以代替的类,但是那也是类似的。
mapper -> SetInput(colorIt -> GetOutput());
vtkActor * actor = vtkActor::New();
actor -> SetMapper(mapper);
6.收尾。
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内部的数据结构依然是很不解,还望高手指点,在哪里可以找到这些数据结构的说明。