1. 基本环境设置
首先确保你已经安装了VTK库,并配置好了C++开发环境。
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
2. 显示文字
2D文字
#include <vtkTextActor.h>
#include <vtkTextProperty.h>
void Show2DText() {
// 创建渲染器和渲染窗口
auto renderer = vtkSmartPointer<vtkRenderer>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
// 创建交互器
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
// 创建文本actor
auto textActor = vtkSmartPointer<vtkTextActor>::New();
textActor->SetInput("Hello VTK!");
// 设置文本属性
auto textProperty = textActor->GetTextProperty();
textProperty->SetFontSize(24);
textProperty->SetColor(1.0, 0.0, 0.0); // 红色
textProperty->SetJustificationToCentered();
// 添加文本到渲染器
renderer->AddActor2D(textActor);
// 开始渲染
renderWindow->Render();
interactor->Start();
}
3D文字
#include <vtkVectorText.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
void Show3DText() {
auto renderer = vtkSmartPointer<vtkRenderer>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
// 创建3D文字
auto textSource = vtkSmartPointer<vtkVectorText>::New();
textSource->SetText("3D Text");
// 创建mapper和actor
auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(textSource->GetOutputPort());
auto actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(0.0, 1.0, 0.0); // 绿色
renderer->AddActor(actor);
renderer->SetBackground(0.1, 0.2, 0.4); // 深蓝色背景
renderWindow->Render();
interactor->Start();
}
中文支持:需转换UTF-8编码并使用中文字体文件(如simsun.ttf
)
3. 显示图片
2D图片
#include <vtkAutoInit.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkImageReader2Factory.h>
#include <vtkImageReader2.h>
#include <vtkImageActor.h>
#include <vtkImageMapper3D.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2); // OpenGL 渲染
VTK_MODULE_INIT(vtkInteractionStyle); // 交互
void Show2DImage(const char* filename) {
auto renderer = vtkSmartPointer<vtkRenderer>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
// 读取图片
auto readerFactory = vtkSmartPointer<vtkImageReader2Factory>::New();
auto reader = readerFactory->CreateImageReader2(filename);
reader->SetFileName(filename);
reader->Update();
// 创建图片actor
auto imageActor = vtkSmartPointer<vtkImageActor>::New();
imageActor->GetMapper()->SetInputConnection(reader->GetOutputPort());
renderer->AddActor(imageActor);
renderer->ResetCamera();
renderWindow->Render();
interactor->Start();
reader->Delete();
}
vtk头文件和库文件:
INCLUDEPATH += "C:/Program Files/VTK/include/vtk-8.2"
LIBS+= -L"C:/Program Files/VTK/lib"
# 必需的核心 VTK 库
LIBS += -lvtksys-8.2
LIBS += -lvtkCommonColor-8.2
LIBS += -lvtkCommonCore-8.2
LIBS += -lvtkCommonDataModel-8.2
LIBS += -lvtkFiltersCore-8.2
LIBS += -lvtkInteractionStyle-8.2
LIBS += -lvtkRenderingCore-8.2
LIBS += -lvtkRenderingOpenGL2-8.2
LIBS += -lvtkViewsQt-8.2
LIBS += -lvtkGUISupportQt-8.2
LIBS += -lvtkRenderingAnnotation-8.2
LIBS += -lvtkCommonExecutionModel-8.2
LIBS += -lvtkIOImage-8.2
4. 显示2D图形
#include <vtkAutoInit.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper2D.h>
#include <vtkActor2D.h>
#include <vtkProperty2D.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2); // OpenGL 渲染
VTK_MODULE_INIT(vtkInteractionStyle); // 交互
void Show2DShape() {
auto renderer = vtkSmartPointer<vtkRenderer>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
// 创建点
auto points = vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(100, 100, 0);
points->InsertNextPoint(200, 100, 0);
points->InsertNextPoint(200, 200, 0);
points->InsertNextPoint(100, 200, 0);
// 创建多边形
auto polygon = vtkSmartPointer<vtkCellArray>::New();
polygon->InsertNextCell(5);
polygon->InsertCellPoint(0);
polygon->InsertCellPoint(1);
polygon->InsertCellPoint(2);
polygon->InsertCellPoint(3);
polygon->InsertCellPoint(0);
// 创建PolyData
auto polygonPolyData = vtkSmartPointer<vtkPolyData>::New();
polygonPolyData->SetPoints(points);
polygonPolyData->SetLines(polygon);
// 创建mapper和actor
auto mapper = vtkSmartPointer<vtkPolyDataMapper2D>::New();
mapper->SetInputData(polygonPolyData);
auto actor = vtkSmartPointer<vtkActor2D>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(1.0, 0.0, 0.0); // 红色
renderer->AddActor(actor);
renderWindow->Render();
interactor->Start();
}
vtk头文件和库文件:
INCLUDEPATH += "C:/Program Files/VTK/include/vtk-8.2"
LIBS+= -L"C:/Program Files/VTK/lib"
# 必需的核心 VTK 库
LIBS += -lvtksys-8.2
LIBS += -lvtkCommonColor-8.2
LIBS += -lvtkCommonCore-8.2
LIBS += -lvtkCommonDataModel-8.2
LIBS += -lvtkFiltersCore-8.2
LIBS += -lvtkInteractionStyle-8.2
LIBS += -lvtkRenderingCore-8.2
LIBS += -lvtkRenderingOpenGL2-8.2
LIBS += -lvtkViewsQt-8.2
LIBS += -lvtkGUISupportQt-8.2
LIBS += -lvtkRenderingAnnotation-8.2
LIBS += -lvtkRenderingFreeType-8.2
LIBS += -lvtkCommonExecutionModel-8.2
5. 显示3D图形
#include <vtkAutoInit.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2); // OpenGL 渲染
VTK_MODULE_INIT(vtkInteractionStyle); // 交互
void Show3DShape() {
auto renderer = vtkSmartPointer<vtkRenderer>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
// 创建圆锥体
auto cone = vtkSmartPointer<vtkConeSource>::New();
cone->SetHeight(3.0);
cone->SetRadius(1.0);
cone->SetResolution(10);
// 创建mapper和actor
auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(cone->GetOutputPort());
auto actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetColor(0.2, 0.63, 0.79); // 蓝色
renderer->AddActor(actor);
renderer->SetBackground(0.1, 0.2, 0.4);
renderer->ResetCamera();
renderWindow->Render();
interactor->Start();
}
vtk头文件和库文件:
INCLUDEPATH += "C:/Program Files/VTK/include/vtk-8.2"
LIBS+= -L"C:/Program Files/VTK/lib"
# 必需的核心 VTK 库
LIBS += -lvtksys-8.2
LIBS += -lvtkCommonColor-8.2
LIBS += -lvtkCommonCore-8.2
LIBS += -lvtkCommonDataModel-8.2
LIBS += -lvtkFiltersCore-8.2
LIBS += -lvtkInteractionStyle-8.2
LIBS += -lvtkRenderingCore-8.2
LIBS += -lvtkRenderingOpenGL2-8.2
LIBS += -lvtkViewsQt-8.2
LIBS += -lvtkGUISupportQt-8.2
LIBS += -lvtkRenderingAnnotation-8.2
LIBS += -lvtkCommonExecutionModel-8.2
LIBS += -lvtkFiltersSources-8.2
使用体绘制:
#include <vtkSmartPointer.h>
#include <vtkMetaImageReader.h>
#include <vtkGPUVolumeRayCastMapper.h>
#include <vtkVolumeProperty.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkVolume.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
void Show3DVolume(const char* filename) {
// 创建渲染器和渲染窗口
auto renderer = vtkSmartPointer<vtkRenderer>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
// 读取3D图像数据(如.mhd/.mha格式)
auto reader = vtkSmartPointer<vtkMetaImageReader>::New();
reader->SetFileName(filename);
reader->Update();
// 创建体积映射器
auto volumeMapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
volumeMapper->SetInputConnection(reader->GetOutputPort());
// 创建体积属性
auto volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
volumeProperty->ShadeOn();
volumeProperty->SetInterpolationTypeToLinear();
// 设置颜色传输函数
auto colorTransferFunction = vtkSmartPointer<vtkColorTransferFunction>::New();
colorTransferFunction->AddRGBPoint(0, 0.0, 0.0, 0.0);
colorTransferFunction->AddRGBPoint(500, 1.0, 0.5, 0.3);
colorTransferFunction->AddRGBPoint(1000, 1.0, 1.0, 0.9);
volumeProperty->SetColor(colorTransferFunction);
// 设置不透明度传输函数
auto opacityTransferFunction = vtkSmartPointer<vtkPiecewiseFunction>::New();
opacityTransferFunction->AddPoint(0, 0.0);
opacityTransferFunction->AddPoint(500, 0.1);
opacityTransferFunction->AddPoint(1000, 0.3);
volumeProperty->SetScalarOpacity(opacityTransferFunction);
// 创建体积对象
auto volume = vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
// 添加到渲染器
renderer->AddVolume(volume);
renderer->SetBackground(0.1, 0.2, 0.4);
renderer->ResetCamera();
renderWindow->Render();
interactor->Start();
}
使用固定平面切片显示:
#include <vtkImagePlaneWidget.h>
void Show3DVolumeWithSlices(const char* filename) {
auto renderer = vtkSmartPointer<vtkRenderer>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
// 读取3D图像数据
auto reader = vtkSmartPointer<vtkMetaImageReader>::New();
reader->SetFileName(filename);
reader->Update();
// 创建三个切片平面(横断面、冠状面、矢状面)
double* center = reader->GetOutput()->GetCenter();
// 横断面
auto planeWidgetX = vtkSmartPointer<vtkImagePlaneWidget>::New();
planeWidgetX->SetInteractor(interactor);
planeWidgetX->SetInputConnection(reader->GetOutputPort());
planeWidgetX->SetPlaneOrientationToXAxes();
planeWidgetX->SetSliceIndex(static_cast<int>(center[0]));
planeWidgetX->DisplayTextOn();
planeWidgetX->SetDefaultRenderer(renderer);
planeWidgetX->On();
// 冠状面
auto planeWidgetY = vtkSmartPointer<vtkImagePlaneWidget>::New();
planeWidgetY->SetInteractor(interactor);
planeWidgetY->SetInputConnection(reader->GetOutputPort());
planeWidgetY->SetPlaneOrientationToYAxes();
planeWidgetY->SetSliceIndex(static_cast<int>(center[1]));
planeWidgetY->DisplayTextOn();
planeWidgetY->SetDefaultRenderer(renderer);
planeWidgetY->On();
// 矢状面
auto planeWidgetZ = vtkSmartPointer<vtkImagePlaneWidget>::New();
planeWidgetZ->SetInteractor(interactor);
planeWidgetZ->SetInputConnection(reader->GetOutputPort());
planeWidgetZ->SetPlaneOrientationToZAxes();
planeWidgetZ->SetSliceIndex(static_cast<int>(center[2]));
planeWidgetZ->DisplayTextOn();
planeWidgetZ->SetDefaultRenderer(renderer);
planeWidgetZ->On();
renderer->SetBackground(0.1, 0.1, 0.1);
renderWindow->SetSize(800, 600);
renderWindow->Render();
interactor->Start();
}
6. 在3D场景中添加文字标注
void Show3DSceneWithText() {
auto renderer = vtkSmartPointer<vtkRenderer>::New();
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);
// 创建3D对象(球体)
auto sphereSource = vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetRadius(1.0);
auto sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
auto sphereActor = vtkSmartPointer<vtkActor>::New();
sphereActor->SetMapper(sphereMapper);
sphereActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
// 创建3D文字标注
auto textSource = vtkSmartPointer<vtkVectorText>::New();
textSource->SetText("Sphere");
auto textMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
textMapper->SetInputConnection(textSource->GetOutputPort());
auto textActor = vtkSmartPointer<vtkActor>::New();
textActor->SetMapper(textMapper);
textActor->SetPosition(1.5, 0, 0);
textActor->GetProperty()->SetColor(1.0, 1.0, 1.0);
// 添加所有对象到渲染器
renderer->AddActor(sphereActor);
renderer->AddActor(textActor);
renderer->SetBackground(0.1, 0.1, 0.1);
renderer->ResetCamera();
renderWindow->SetSize(800, 600);
renderWindow->Render();
interactor->Start();
}
7. 完整流程示例
#include <vtkAutoInit.h>
#include <vtkDataSetMapper.h>
#include <vtkDoubleArray.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkScalarBarActor.h>
#include <vtkTriangle.h>
#include <vtkUnstructuredGrid.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRendererCollection.h>
#include <vtkVectorText.h>
#include <vtkPolyDataMapper.h>
#include <vtkTextActor.h>
#include <vtkTextProperty.h>
#include <vtkRenderWindowInteractor.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2); // OpenGL 渲染
VTK_MODULE_INIT(vtkInteractionStyle); // 交互
VTK_MODULE_INIT(vtkRenderingFreeType); // 关键:启用文字渲染
int main() {
// 初始化渲染器、窗口
vtkNew<vtkRenderer> renderer;
vtkNew<vtkRenderWindow> window;
window->AddRenderer(renderer);
// 1. 添加3D文字
vtkNew<vtkVectorText> text3D;
text3D->SetText("3D Text");
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(text3D->GetOutputPort());
vtkNew<vtkActor> actor;
actor->SetMapper(mapper);
actor->SetPosition(0, 0, 0);
renderer->AddActor(actor);
// 2. 添加2D文字
vtkNew<vtkTextActor> text2D;
text2D->SetInput("2D Overlay");
text2D->GetTextProperty()->SetFontSize(20);
text2D->SetPosition(50, 50); // 屏幕坐标
renderer->AddActor2D(text2D);
// 3. 启动交互
vtkNew<vtkRenderWindowInteractor> interactor;
interactor->SetRenderWindow(window);
window->Render();
interactor->Start();
}
vtk头文件和库文件:
INCLUDEPATH += "C:/Program Files/VTK/include/vtk-8.2"
LIBS+= -L"C:/Program Files/VTK/lib"
# 必需的核心 VTK 库
LIBS += -lvtksys-8.2
LIBS += -lvtkCommonColor-8.2
LIBS += -lvtkCommonCore-8.2
LIBS += -lvtkCommonDataModel-8.2
LIBS += -lvtkFiltersCore-8.2
LIBS += -lvtkInteractionStyle-8.2
LIBS += -lvtkRenderingCore-8.2
LIBS += -lvtkRenderingOpenGL2-8.2
LIBS += -lvtkViewsQt-8.2
LIBS += -lvtkGUISupportQt-8.2
LIBS += -lvtkRenderingAnnotation-8.2
LIBS += -lvtkRenderingFreeType-8.2
LIBS += -lvtkCommonExecutionModel-8.2
8. 混合2D/3D场景的关键技巧
- 坐标系区分:
- 2D元素(文字/图片)用
AddActor2D
- 3D元素(模型/文本)用
AddActor
- 2D元素(文字/图片)用
- 位置控制:
- 2D元素:通过
SetPosition
设置屏幕坐标(范围0~1) - 3D元素:通过
SetPosition
设置世界坐标
- 2D元素:通过
- 交互优化:
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); interactor->SetInteractorStyle(style); // 启用3D交互模式
9. 支持的3D图像格式
VTK支持多种3D图像格式,常用的包括:
MetaImage格式 (.mhd/.mha)
使用
vtkMetaImageReader
DICOM序列
使用
vtkDICOMImageReader
NIfTI格式 (.nii)
使用
vtkNIFTIImageReader
Analyze格式 (.hdr/.img)
使用
vtkAnalyzeReader
原始数据
使用
vtkImageReader2
并设置适当参数
10. 性能优化技巧
对于大型数据集,使用
vtkGPUVolumeRayCastMapper
替代CPU渲染器适当降低采样率以提高交互性能
使用多分辨率技术,在交互时显示低分辨率版本
考虑使用
vtkImageResample
预先降低数据分辨率对于静态视图,可以预先计算并缓存渲染结果