3D图像处理时,为了让用户理解某个部件的用法,通常会在部件的旁边标注相应的文本,作为注释来;文本注释对视觉理解方面是不可或缺的。
在 VTK 中提供了两种文本注释方法:
2D 文本注释,这种方式的特点:文本是贴在图像渲染窗口上,视觉效果文本在3D渲染图像的前面,呈现遮挡状态;
3D文本注释,文本作为 3D Polydata 数据类型创建, 可作为3D集合对象展示,可旋转、可缩放;
2D 文本注释
对于第一种,主要用到 2D Actors(vtkActor2D 和它的子类 例如 vtkScaledTextActor) 、Mappers(vtkMapper 2D 和它的子类 vtkTextMapper ),
2DTextActor 和 Mapper 与 3D文本注释相似,两者最大区别:
一种是文本以2D文本贴到窗口上,位置固定不可动;一种是文本以3D对象创建,可旋转、可缩放(绘制窗口设置了交互效果);
下面这个例子中展示的就是 2D Text 文本注释,例子中创建了两个对象:
1,Sphere 3D 图像,以 vtkLODActor 类创建,作为 3D 对象;
2,Text 文本,以 vtkTextActor 类创建,用于作为注释文本;
绘制时,把两个 Actor 全部加入 Renderer (绘制器)中;这里文本属性用到 vtkTextProperty 类,用于设置文本走向(垂直、水平)、颜色、坐标及文字类型(大小、字体)等;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
int main(){
vtkSmartPointer sphere =
vtkSmartPointer::New();
vtkSmartPointer polymapper =
vtkSmartPointer::New();
vtkSmartPointer sphereActor =
vtkSmartPointer::New();
vtkSmartPointer textActor =
vtkSmartPointer::New();
vtkSmartPointer colors =
vtkSmartPointer::New();
polymapper->SetInputConnection(sphere->GetOutputPort());
polymapper->GlobalImmediateModeRenderingOn();//ImmadianteMode on;
sphereActor->SetMapper(polymapper);
textActor->SetTextScaleModeToProp();
textActor->SetDisplayPosition(90, 50);//Position
textActor->SetInput("VTK Text Diaplayed!");
textActor->GetActualPosition2Coordinate()->SetCoordinateSystemToNormalizedViewport();
textActor->GetPosition2Coordinate()->SetValue(0.6, 0.1);
textActor->GetTextProperty()->SetFontSize(18);
textActor->GetTextProperty()->SetFontFamilyToArial();
textActor->GetTextProperty()->SetJustificationToCentered();
textActor->GetTextProperty()->BoldOn();
textActor->GetTextProperty()->ItalicOn();
textActor->GetTextProperty()->ShadowOn();
textActor->GetTextProperty()->SetColor(0, 0, 1);
vtkSmartPointer ren = vtkSmartPointer::New();
vtkSmartPointer renWin = vtkSmartPointer::New();
vtkSmartPointer iren = vtkSmartPointer::New();
ren->SetBackground(colors->GetColor3d("SlateGray").GetData());
ren->AddViewProp(textActor);
ren->AddActor(sphereActor);
renWin->AddRenderer(ren);
iren->SetRenderWindow(renWin);try
{
renWin->Render();
iren->Start();
}catch (std::exception & e)
{std::cout <"Exceptation caught!" <std::endl;std::cout <std::endl;return EXIT_FAILURE;
}return EXIT_SUCCESS;
}
展示效果如下:
3D 文本注释 vtkFollower
3D文本注释利用 vtkVectorText 来创建一个 文本字符串的 polygonal 表示方式,然后将其放置在场景的合适位置;
定位 3D Text有用的类为 vtkFollower ,此类是经常面向 Renderer 的 active camera 表示的是 Actor 的类,借此确保文本可读性;
下面的代码部分就是关于 3D文本注释的效果实现,创建 一个数轴,结合 vtkVectorText 与 vtkFollower 对数轴原点进行标注;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(){
vtkSmartPointer axes = vtkSmartPointer::New();
vtkSmartPointer polymapper =
vtkSmartPointer::New();
vtkSmartPointer colors =
vtkSmartPointer::New();
polymapper->SetInputConnection(axes->GetOutputPort());// axes object;
vtkSmartPointer axesActor = vtkSmartPointer::New();
axesActor->SetMapper(polymapper);
vtkSmartPointer atext = vtkSmartPointer::New();
atext->SetText("Origin");
vtkSmartPointer textMapper =
vtkSmartPointer::New();
textMapper->SetInputConnection(atext->GetOutputPort());
vtkSmartPointer textActor =// vtkVectorActor vtkFollwer;
vtkSmartPointer::New();
textActor->SetMapper(textMapper);
textActor->SetScale(0.2, 0.2, 0.2);
textActor->AddPosition(0, 0.1, 0);
textActor->GetProperty()->SetColor(0, 0, 1);
vtkSmartPointer ren = vtkSmartPointer::New();
vtkSmartPointer renWin = vtkSmartPointer::New();
vtkSmartPointer iren = vtkSmartPointer::New();
ren->AddViewProp(textActor);//Add Actor;
ren->AddActor(axesActor);
ren->SetBackground(colors->GetColor3d("StateGray").GetData());//back ground color;
textActor->SetCamera(ren->GetActiveCamera());
renWin->AddRenderer(ren);
iren->SetRenderWindow(renWin);
renWin->Render();
iren->Start();
}
最终结果展示如下:
VTK 基础(一) — 常用控件介绍及实现圆锥体绘制
VTK 基础(二) — 单窗口实现多对象绘制!
分别用 VTK 体绘制和面绘制来实现医学图像三维重建;