VTK入门系列之一:画一个圆柱体
🌀 VTK入门系列之一:画一个圆柱体
本文是《VTK入门系列》的第一篇,目标是从最基础的 C++ 示例出发,一步步带你掌握 VTK 的可视化开发。
✨ 前言:什么是 VTK?
VTK(Visualization Toolkit) 是一个强大的开源三维图形库,广泛用于科学可视化、医疗图像处理、工程仿真等场景。它基于 C++ 编写,并提供了多种语言绑定(如 Python、Java 等)。
如果你想用 C++ 打造自己的 3D 可视化软件、医学图像处理工具、甚至是体绘制系统,VTK 是不可绕开的利器。
🎯 今天我们要做什么?
用 VTK 在窗口中画出一个可以交互旋转的圆柱体。这是最基础的入门示例之一,也是 VTK 渲染流程的完整缩影。
🧱 准备工作
在你阅读本文之前,请确保:
- 已成功安装 VTK(Windows 环境建议使用 CMake + Visual Studio)
- 新建一个 C++ 项目,CMakeLists.txt 已正确链接 VTK
- 能够编译并运行简单的 C++ 程序
如果你还没配置环境,可以留言获取配置教程。
🧩 圆柱体代码全览
我们先贴出完整代码:
#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;
}
🔍 每一部分代码详解
1️⃣ 创建圆柱体(数据源)
vtkCylinderSource *cylinder = vtkCylinderSource::New();
cylinder->SetResolution(8);
这段代码创建一个“八边形的柱体”(而不是完美圆柱),可以理解为一个“粗略近似的圆柱体模型”。
2️⃣ 几何数据 → 图形数据
vtkPolyDataMapper *cylinderMapper = vtkPolyDataMapper::New();
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
Mapper 是 VTK 的“数据翻译器”,它把 cylinder 的几何结构翻译成可以渲染的图形数据。
3️⃣ 创建 Actor(演员:显示出来的物体)
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
表示“要显示在屏幕上的对象”。你可以给它设置:
- 颜色(RGB)
- 旋转角度
- 透明度
- 材质光照属性(后续可以深入)
4️⃣ 渲染系统三件套:Renderer、RenderWindow、Interactor
vtkRenderer *ren1 = vtkRenderer::New();
vtkRenderWindow *renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren1);
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
VTK 的渲染架构大致如下:
元件 | 作用 |
---|---|
vtkRenderer |
渲染一个场景(决定画什么、怎么画) |
vtkRenderWindow |
显示渲染的结果 |
vtkRenderWindowInteractor |
提供交互功能(鼠标旋转、缩放等) |
5️⃣ 加入场景并设置基本参数
ren1->AddActor(cylinderActor);
ren1->SetBackground(0.1, 0.2, 0.4);
renWin->SetSize(200, 200);
这段代码完成:
- 场景里添加圆柱体
- 设置背景色为深蓝
- 设置窗口像素尺寸为 200×200
6️⃣ 调整摄像机视角并渲染
ren1->ResetCamera();
ren1->GetActiveCamera()->Zoom(1.5);
renWin->Render();
如果不 ResetCamera,很可能你画的东西在屏幕外根本看不到。Zoom 是缩放视野,让物体更清晰。
7️⃣ 启动交互
iren->Start();
一旦调用 .Start()
,程序会进入一个事件循环,直到你关闭窗口。可以用鼠标旋转模型、缩放等操作。
8️⃣ 清理资源
cylinder->Delete();
cylinderMapper->Delete();
...
因为我们使用了 New()
创建对象,在 C++ 中要记得用 Delete()
来释放,防止内存泄露。
✅ 如果使用
vtkSmartPointer
(推荐),这些就会自动管理内存。
🎥 效果图预期
运行程序后,你应该看到一个橘红色的圆柱体,背景是深蓝色,可以用鼠标拖动查看不同角度。
🧠 总结
这段短短的代码,其实已经完整体现了 VTK 的核心渲染流程:
[数据源] → [Mapper] → [Actor] → [Renderer] → [RenderWindow] → [Interactor]
这也是你之后做任意 3D 可视化时都会用到的“套路”。
📌 下一步建议
- 把圆柱体换成球体:
vtkSphereSource
- 尝试加多个 actor 到场景里
- 尝试加坐标轴、网格、灯光
🚀 系列预告
《VTK入门系列》将包括:
- 画一个圆柱体 ✅
- 渲染一个球体,并添加坐标轴
- 加载 STL 或 OBJ 模型
- 动态旋转和动画演示
- 鼠标拾取和对象交互
- 医疗图像(DICOM)三维重建(进阶)
敬请期待!
💬 如果你觉得本文对你有帮助
欢迎点赞、收藏、转发给更多想入门 VTK 的同学 🙌
也可以留言你的问题,我会更新文章内容或补写你需要的功能。