时间:2025-04-17 16:05
人气:
作者:admin
本文是《VTK入门系列》的第一篇,目标是从最基础的 C++ 示例出发,一步步带你掌握 VTK 的可视化开发。
VTK(Visualization Toolkit) 是一个强大的开源三维图形库,广泛用于科学可视化、医疗图像处理、工程仿真等场景。它基于 C++ 编写,并提供了多种语言绑定(如 Python、Java 等)。
如果你想用 C++ 打造自己的 3D 可视化软件、医学图像处理工具、甚至是体绘制系统,VTK 是不可绕开的利器。
用 VTK 在窗口中画出一个可以交互旋转的圆柱体。这是最基础的入门示例之一,也是 VTK 渲染流程的完整缩影。
在你阅读本文之前,请确保:
如果你还没配置环境,可以留言获取配置教程。
我们先贴出完整代码:
#include "vtkCylinderSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
int main()
{
vtkCylinderSource *cylinder = vtkCylinderSource::New();
cylinder->SetResolution(8);
vtkPolyDataMapper *cylinderMapper = vtkPolyDataMapper::New();
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
vtkActor *cylinderActor = vtkActor::New();
cylinderActor->SetMapper(cylinderMapper);
cylinderActor->GetProperty()->SetColor(1.0, 0.3882, 0.2784);
cylinderActor->RotateX(30.0);
cylinderActor->RotateY(-45.0);
vtkRenderer *ren1 = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
ren1->AddActor(cylinderActor);
ren1->SetBackground(0.1, 0.2, 0.4);
renWin->SetSize(200, 200);
ren1->ResetCamera();
ren1->GetActiveCamera()->Zoom(1.5);
renWin->Render();
iren->Start();
// 清理资源
cylinder->Delete();
cylinderMapper->Delete();
cylinderActor->Delete();
ren1->Delete();
renWin->Delete();
iren->Delete();
return 0;
}
vtkCylinderSource *cylinder = vtkCylinderSource::New();
cylinder->SetResolution(8);
这段代码创建一个“八边形的柱体”(而不是完美圆柱),可以理解为一个“粗略近似的圆柱体模型”。
vtkPolyDataMapper *cylinderMapper = vtkPolyDataMapper::New();
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
Mapper 是 VTK 的“数据翻译器”,它把 cylinder 的几何结构翻译成可以渲染的图形数据。
vtkActor *cylinderActor = vtkActor::New();
cylinderActor->SetMapper(cylinderMapper);
cylinderActor->GetProperty()->SetColor(1.0, 0.3882, 0.2784);
cylinderActor->RotateX(30.0);
cylinderActor->RotateY(-45.0);
VTK 使用 Actor 表示“要显示在屏幕上的对象”。你可以给它设置:
vtkRenderer *ren1 = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
VTK 的渲染架构大致如下:
| 元件 | 作用 |
|---|---|
vtkRenderer |
渲染一个场景(决定画什么、怎么画) |
vtkRenderWindow |
显示渲染的结果 |
vtkRenderWindowInteractor |
提供交互功能(鼠标旋转、缩放等) |
ren1->AddActor(cylinderActor);
ren1->SetBackground(0.1, 0.2, 0.4);
renWin->SetSize(200, 200);
这段代码完成:
ren1->ResetCamera();
ren1->GetActiveCamera()->Zoom(1.5);
renWin->Render();
如果不 ResetCamera,很可能你画的东西在屏幕外根本看不到。Zoom 是缩放视野,让物体更清晰。
iren->Start();
一旦调用 .Start(),程序会进入一个事件循环,直到你关闭窗口。可以用鼠标旋转模型、缩放等操作。
cylinder->Delete();
cylinderMapper->Delete();
...
因为我们使用了 New() 创建对象,在 C++ 中要记得用 Delete() 来释放,防止内存泄露。
✅ 如果使用
vtkSmartPointer(推荐),这些就会自动管理内存。
运行程序后,你应该看到一个橘红色的圆柱体,背景是深蓝色,可以用鼠标拖动查看不同角度。
这段短短的代码,其实已经完整体现了 VTK 的核心渲染流程:
[数据源] → [Mapper] → [Actor] → [Renderer] → [RenderWindow] → [Interactor]
这也是你之后做任意 3D 可视化时都会用到的“套路”。
vtkSphereSource《VTK入门系列》将包括:
敬请期待!
欢迎点赞、收藏、转发给更多想入门 VTK 的同学 ????
也可以留言你的问题,我会更新文章内容或补写你需要的功能。