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入门系列》将包括:

  1. 画一个圆柱体 ✅
  2. 渲染一个球体,并添加坐标轴
  3. 加载 STL 或 OBJ 模型
  4. 动态旋转和动画演示
  5. 鼠标拾取和对象交互
  6. 医疗图像(DICOM)三维重建(进阶)

敬请期待!


💬 如果你觉得本文对你有帮助

欢迎点赞、收藏、转发给更多想入门 VTK 的同学 🙌
也可以留言你的问题,我会更新文章内容或补写你需要的功能。


posted @ 2025-04-17 16:05  智研定制助手  阅读(366)  评论(0)    收藏  举报