文本标注被遮挡_vtk基础(三) — 文本注释 vtkTextActor 和 vtkFollower 的使用

本文介绍了在VTK中创建2D和3D文本注释的方法。2D文本注释使用vtkTextActor,固定在窗口上,而3D文本注释使用vtkFollower,可在3D空间中旋转和缩放,确保可读性。通过实例展示了如何创建和使用这两种文本注释类型。
摘要由CSDN通过智能技术生成

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;
}

展示效果如下:

ee4fca1c5e1e377fc21af3854ccd5aca.png
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();
}

最终结果展示如下:

16bbaf58cfcb2303518b5af34dc6136e.png
推荐阅读

VTK 基础(一)  —  常用控件介绍及实现圆锥体绘制

VTK 基础(二)  —  单窗口实现多对象绘制!

分别用 VTK 体绘制和面绘制来实现医学图像三维重建;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值