VTK的对象管理与图形渲染
先从一个简单的示例开始,修改自官方示例程序
//...界面设置...
// 创建几何体对象
vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
sphereSource->SetCenter(0.0, 0.0, 0.0);
sphereSource->SetRadius(5.0);
sphereSource->Update();
// 创建几何体映射及转换对象
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(sphereSource->GetOutputPort());
// 创建场景中的(几何体)对象
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
// 创建渲染容器
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
// ...界面中放置渲染容器...
示例展示了一个简易的VTK图形可视化过程,将一个白色球体显示到屏幕上,VTK的渲染结构如下:
示例中包含了VTK的几个重要概念,下面分别加以介绍。
对象管理
通常用两个模板类vtkNew<T>和vtkSmartPointer<T>来创建VTK对象,它们最终都继承自一个重要的抽象基类vtkObjectBase。
vtkObjectBase是VTK中绝大多数类的基类,它规范了对VTK对象的管理:
1. 将其构造函数及析构函数设置为protected权限,
2. 提供了一个静态函数New()和一个虚函数Delete(), 并重载了new和delete操作符,
3. 执行引用计数, 类似于c++中智能指针的引用计数
vtkNew在概念上类似于std::unqiue_ptr,当使用vtkNew创建对象时,它会自动在堆上创建一个对象,并在vtkNew实例超出其作用域时自动调用对象的Delete()方法,确保对象被正确销毁。
vtkNew是独占所有权,一个vtkNew实例唯一拥有其创建对象,不允许复制或赋值给其它vtkNew实例,它适用于简单的、不涉及对象共享的场景,在局部范围内创建和使用对象,对象在使用完后自动销毁,避免了手动调用Delete()的麻烦。
而vtkSmartPointer在概念上则类似于std::shared_ptr,vtkSmartPointer使用引用计数机制,它允许将对象的引用传递给其他vtkSmartPointer实例或使用Register()方法增加引用次数,当调用UnRegister()方法,或实例超出作用域时会减少引用次数,当引用次数降为0时,对象会被自动销毁。
vtkSmartPointer适用于需要在多个部分共享对象的场景,适合于在复杂的数据结构或多个函数之间传递对象。
从几何体到vtkActor
几何体表示实际几何形状的数据结构,主要用于存储和描述几何对象的顶点坐标、拓扑关系等底层几何信息,例如常用的vtkPolyData表示多边形数据,上例中的vtkSphereSource类就生成了一个球形的vtkPolyData数据。
但几何体本身并不具备直接渲染的能力,只是提供了渲染所需的数据,要将几何体表示的数据进行渲染,需要将其转成vtkActor。
vtkActor表示场景中的可渲染对象,它不仅包含了渲染所需的几何数据,还包含了与之关联的属性,如颜色、纹理、透明度、材质、位置、方向、缩放等等。
可以将vtkActor看作是场景中的一个实体,比如一个球体、一个立方体或一个多边形等,并且可以对其进行各种操作,如设置其位置、旋转、缩放、透明度等。
而从几何体到vtkActor之间的转换,则由vtkMapper来完成。
作为几何体数据和vtkActor之间的桥梁,vtkMapper的首要功能便是数据适配,不同的几何体有其特定的数据结构,这些数据格式不能直接被图形硬件所识别和渲染,vtkMapper则将这些不同类型的几何体数据进行适配,转换为图形硬件能够理解的基本图元,如点、线、三角形等。
除了几何信息,几何体数据还可能包含各种属性,如颜色、法向量、纹理坐标,vtkMapper负责将这些属性信息与相应的几何图元进行正确的映射,确保在渲染时每个图元都能正确地应用其对应的属性,所以每种几何体,都有与之对应的vtkMapper。
vtkActor与vtkRenderer
当数据从几何体映射成vtkActor,渲染的数据准备工作就已完成,要在屏幕上渲染出一个场景,除了被渲染对象,还需要光照、相机等对象,而这些,都由vtkRenderer提供或管理。
vtkRenderer是渲染场景的容器,它负责管理多个vtkActor,并按照添加的顺序依次渲染到屏幕上,可以将vtkRenderer想象成一个舞台,而vtkActor是舞台上的演员,多个演员在舞台上共同构成一个完整的场景。
本文完
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人