TextAnotation2D是显示在三维物体之上的一个平面内(overlay plane)。而vtkVectorText文字本身是三维数据,跟其他三维物体没有区别。vtkFollower是一种Actor,它总是朝向renderer的相机。
TextAnotation2D
#include "TextAnotation2D.h"
#include "vtkSphereSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkLODProp3D.h"
#include "vtkTextActor.h"
#include "vtkTextProperty.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
TextAnotation2D::TextAnotation2D()
{
vtkSphereSource* sphere = vtkSphereSource::New();
vtkPolyDataMapper* sphereMapper = vtkPolyDataMapper::New();
sphereMapper->SetInputConnection(sphere->GetOutputPort());
vtkActor* sphereActor = vtkActor::New();
sphereActor->SetMapper(sphereMapper);
//
vtkTextActor* textActor = vtkTextActor::New();
textActor->SetTextScaleModeToProp();
textActor->SetDisplayPosition(90, 50);
textActor->SetInput("This is a sphere");
textActor->GetPosition2Coordinate()->SetCoordinateSystemToNormalizedViewport();
textActor->GetPosition2Coordinate()->SetValue(0.6, 0.1);
//
auto tprop = textActor->GetTextProperty();
tprop->SetFontSize(18);
tprop->SetFontFamilyToArial();
tprop->SetJustificationToCentered();
tprop->BoldOn();
tprop->ItalicOn();
tprop->ShadowOn();
tprop->SetColor(0, 0, 1);
//
vtkRenderWindow* renWin = vtkRenderWindow::New();
vtkRenderer* ren = vtkRenderer::New();
ren->AddActor(sphereActor);
ren->AddViewProp(textActor);
renWin->AddRenderer(ren);
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
renWin->Render();
iren->Start();
}
效果如下:
vtkVectorText
#include "TextAnotation3D.h"
#include "vtkAxes.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkVectorText.h"
#include "vtkFollower.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
TextAnotation3D::TextAnotation3D()
{
vtkAxes* axes = vtkAxes::New();
axes->SetOrigin(0, 0, 0);
vtkPolyDataMapper* axesMapper = vtkPolyDataMapper::New();
axesMapper->SetInputConnection(axes->GetOutputPort());
vtkActor* axesActor = vtkActor::New();
axesActor->SetMapper(axesMapper);
//
vtkVectorText* atext = vtkVectorText::New();
atext->SetText("Orgin");
vtkPolyDataMapper* textMapper = vtkPolyDataMapper::New();
textMapper->SetInputConnection(atext->GetOutputPort());
vtkFollower* textActor = vtkFollower::New();
textActor->SetMapper(textMapper);
textActor->SetScale(0.2, 0.2, 0.2);
textActor->AddPosition(0, -0.1, 0);
//
vtkRenderWindow* renWin = vtkRenderWindow::New();
vtkRenderer* ren = vtkRenderer::New();
ren->SetBackground(1, 0.5, 0);
renWin->AddRenderer(ren);
textActor->SetCamera(ren->GetActiveCamera());
ren->AddActor(axesActor);
ren->AddActor(textActor);
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
renWin->Render();
iren->Start();
}
我们试着把SetCamera注释掉,可以看到vtkVectorText本身在三维场景里的样子。