vtkCubeAxes的相关使用

来源:互联网 发布:手机音乐软件 编辑:程序博客网 时间:2024/06/06 15:42
 在vtk画的三维图中,经常需要给三维图表上相应的坐标,在VTK中提供了相应的类vtkCubeAxes和vtkCubeAxes2D,这这篇文章中,简单的介绍一下vtkCubeAxes这个类的使用。首先还是直接贴代码:
 vtkSmartPointer<vtkCubeAxesActor> cubeAxesActor =vtkSmartPointer<vtkCubeAxesActor>::New(); cubeAxesActor->SetBounds(inputImage->GetBounds());//inputImage为一个3维的vtkImageData数据 cubeAxesActor->SetXTitle("X /mm");//设置X轴的标签 cubeAxesActor->SetYTitle("Depth /mm"); cubeAxesActor->SetZTitle("Y /mm"); cubeAxesActor->GetTitleTextProperty(0)->SetColor(1.0, 0.0, 1.0);//设置x轴的标题的颜色为 cubeAxesActor->GetLabelTextProperty(0)->SetColor(1.0, 0.0, 1.0);//设置x轴的标签label颜色 cubeAxesActor->GetTitleTextProperty(1)->SetColor(0.0, 1.0, 0.0); cubeAxesActor->GetLabelTextProperty(1)->SetColor(0.0, 1.0, 0.0); cubeAxesActor->GetTitleTextProperty(2)->SetColor(0.5, 0.5, 1.0); cubeAxesActor->GetLabelTextProperty(2)->SetColor(0.5, 0.5, 1.0);aRenderer->AddActor(cubeAxesActor);

上面的就可以使用最基本的坐标轴了,运行的结果是:
这里写图片描述
但是这个只是最基本的显示坐标轴和坐标轴标签,我们可能还需要调整坐标轴的原点,而且上图在旋转时坐标轴还会跟着不停的移动位置,始终显示在视野的最前方,非常讨厌,另外大家可能觉得坐标轴显示的刻度有点小,下面是一些vtkCubeAxes提供的方法来进行调整:
首先是坐标轴刻度过密的问题:

cubeAxesActor->XAxisMinorTickVisibilityOff();//小标尺的打开与关闭cubeAxesActor->YAxisMinorTickVisibilityOff();cubeAxesActor->ZAxisMinorTickVisibilityOff();

通过上面的方法可以关闭小标尺,运行结果:
这里写图片描述

是不看着清爽很多。
然后是固定坐标轴的原点使其始终位于0,因为在三维图形旋转的时候坐标轴会改变位置,使其始终位于视野正前方,这样三个轴交汇的XYZ值会不停的变化,解决这个的方法有两个,一种是:

cubeAxesActor->SetUseAxisOrigin(1);//里面的参数可以设为0和1,设置为1则可以固定显示的坐标轴的起点始终固定,那么坐标轴就不会随着物体的移动而移动。

运行结果:

另一种方法是设置FlyMode模式来确定坐标轴显示的位置是位于最近、最远、固定等

cubeAxesActor->SetFlyModeToStaticEdges();//调整坐标轴显示固定在一个轴上

当然这个FlyMode模式还有很多,自己去查文档就可以知道,这边我也不太清楚为什么设置成上面的方法后会出现下面这种每个边都有坐标轴的效果:
这里写图片描述
还有上面的坐标轴、标签等都可以通过Visibility函数来设置是否显示来达到自己想要的效果。
最后还有设置坐标轴标签大小的函数:

cubeAxesActor->SetScreenSize(25);//默认大小是10个像素

当然还有一些比较高档的用法,等着大家自己发觉。

最后如果大家只想要显示XYZ坐标轴,但是又显示像上面的立体包围盒怎么办,这就要用到类vtkOutlineFilter,专门用来产生立体的包围盒,类的使用方法也非常简单,生成vtkOutlineFilter类的对象,输入想要显示包围盒的对象,生成vtkPolyData数据,添加到vtkActor中,设置包围盒的颜色,最后将结果添加到Render中就可以了。代码:

vtkSmartPointer<vtkOutlineFilter> outlineData =vtkSmartPointer<vtkOutlineFilter>::New();//画出包围盒outlineData->SetInputData(inputImage);vtkSmartPointer<vtkPolyDataMapper> mapOutline =vtkSmartPointer<vtkPolyDataMapper>::New();mapOutline->SetInputConnection(outlineData->GetOutputPort());vtkSmartPointer<vtkActor> outline =vtkSmartPointer<vtkActor>::New();outline->SetMapper(mapOutline);outline->GetProperty()->SetColor(1.0,1.0,1.0);//设置包围盒的边界的颜色为黑aRenderer->AddActor(outline);

运行结果:

这里写图片描述

最后这些图都没有调整固定的视角,都是随即视角,所以后面可能会写写vtkCamera的用法。

0 0
原创粉丝点击