文章目录
-
- [1. 概述](#1. 概述)
- [2. CMake链接VTK](#2. CMake链接VTK)
- [3. main.cpp文件](#3. main.cpp文件)
- [4. 演示效果](#4. 演示效果)
| 更多精彩内容 |
|---|
| 👉内容导航 👈 |
| 👉VTK开发 👈 |
1. 概述
主要功能
读取分子数据 :使用
vtkCMLMoleculeReader从指定路径加载 CML 格式的分子文件。设置可视化方式 :采用球棒模型 (
UseBallAndStickSettings) 来显示分子结构,取消注释可使用其他三种显示模型。配置渲染属性:调整了材质的漫反射、镜面反射强度及高光指数以优化视觉效果。
CML(Chemical Markup Language,化学标记语言)是一种基于XML的开放标准格式,专门用于存储和交换化学信息。它由Peter Murray-Rust等人开发,旨在为化学领域提供一种标准化的数据表示方法。
主要类说明
- vtkCMLMoleculeReader:专门用于读取化学标记语言(Chemical Markup Language, CML)格式分子数据的类;
- vtkMoleculeMapper:用于渲染分子结构数据的可视化映射器类。
使用CML文件下载地址
VTK环境使用vcpkg安装,使用vcpkg安装的VTK编译后会自动打包依赖的dll到可执行程序路径下,方便程序运行;
手动编译和引入VTK看这里
| 环境 | 说明 |
|---|---|
| 系统 | ubuntu22.04、windows11 |
| cmake | 3.22、3.25 |
| Qt | 5.14.2 |
| 编译器 | g++11.4、msvc2017 |
| VTK | 9.4.1 |
2. CMake链接VTK
shell
cmake_minimum_required(VERSION 3.20 FATAL_ERROR) # 设置CMake最低版本
include("D:/vcpkg/scripts/buildsystems/vcpkg.cmake") # 引入vcpkg 《《《《《《
project(vtk_vcpkg) # 设置工程名
# 设置C++标准
set(CMAKE_CXX_STANDARD 14)
# 设置MSVC编译器使用UTF-8编码
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
endif()
# 查找VTK
find_package(VTK COMPONENTS
CommonColor
CommonCore
DomainsChemistry
DomainsChemistryOpenGL2
IOChemistry
InteractionStyle
RenderingContextOpenGL2
RenderingCore
RenderingFreeType
RenderingGL2PSOpenGL2
RenderingOpenGL2
)
if (NOT VTK_FOUND) # 如果VTK没有找到
message(FATAL_ERROR "VTK 没找到") # 报错
return()
endif()
add_executable(${PROJECT_NAME} main.cpp) # 添加可执行文件
target_link_libraries(${PROJECT_NAME} PRIVATE ${VTK_LIBRARIES}) # 链接VTK库
# 设置VTK模块自动初始化
vtk_module_autoinit(
TARGETS ${PROJECT_NAME}
MODULES ${VTK_LIBRARIES}
)
3. main.cpp文件
cpp
#include <vtkActor.h> // 用于表示三维场景中的对象
#include <vtkCMLMoleculeReader.h> // 用于读取 CML 格式的分子文件
#include <vtkCamera.h> // 相机类,控制视图视角
#include <vtkMoleculeMapper.h> // 分子结构专用映射器
#include <vtkNamedColors.h> // 提供预定义颜色名称
#include <vtkNew.h> // 智能指针管理对象生命周期
#include <vtkProperty.h> // 控制 actor 的渲染属性(如材质)
#include <vtkRenderWindow.h> // 渲染窗口类
#include <vtkRenderWindowInteractor.h> // 处理用户交互事件
#include <vtkRenderer.h> // 负责场景渲染
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
// 定义要读取的 cml 文件路径
string filename = "E:/VTK/vtk-data/Data/porphyrin.cml";
// 创建一个 CML 分子文件读取器实例
vtkNew<vtkCMLMoleculeReader> reader;
// 设置要读取的文件名
reader->SetFileName(filename.c_str());
// 注意:不需要显式调用 Update() 方法,因为 GetOutputPort() 会在需要时自动更新数据
// 创建分子结构映射器,用于将分子数据转换为图形表示
vtkNew<vtkMoleculeMapper> mapper;
// 将读取器输出连接到映射器输入端口
mapper->SetInputConnection(reader->GetOutputPort());
mapper->UseBallAndStickSettings(); // 使用球棒模型显示分子(原子用球体表示,化学键用棒状表示)
// mapper->UseVDWSpheresSettings(); // 使用球体模型显示分子(原子用球体表示,化学键用球体表示)
// mapper->UseLiquoriceStickSettings(); // 原子和化学键都以相对较粗的圆柱体形式展示
// mapper->UseFastSettings(); // 渲染质量和性能之间取得平衡的选择
// 创建演员对象,它是可视化管线的最终呈现者
vtkNew<vtkActor> actor;
// 设置该演员使用的映射器
actor->SetMapper(mapper);
// 设置材质漫反射系数(影响光照效果)[0.0, 1.0]
actor->GetProperty()->SetDiffuse(0.7);
// 设置高光反射强度 [0.0, 1.0]
actor->GetProperty()->SetSpecular(0.5);
// 设置高光反射指数(决定高光区域大小)[0, 128]
actor->GetProperty()->SetSpecularPower(20);
// 创建渲染器,负责管理场景中的所有演员
vtkNew<vtkRenderer> ren;
// 向渲染器中添加演员
ren->AddActor(actor);
// 创建命名颜色对象,方便使用标准颜色名称
vtkNew<vtkNamedColors> colors;
// 设置背景色为银灰色
ren->SetBackground(colors->GetColor3d("Silver").GetData());
// 创建渲染窗口,并关联之前创建的渲染器
vtkNew<vtkRenderWindow> renderWindow;
renderWindow->AddRenderer(ren);
// 设置窗口标题
renderWindow->SetWindowName("readCML");
// 设置窗口尺寸为 600x500 像素
renderWindow->SetSize(600, 500);
// 执行一次渲染操作
renderWindow->Render();
// 获取活动相机并放大两倍视野,>1放大 0<x<1缩小(需要放在Render后)
ren->GetActiveCamera()->Zoom(2.0);
// 创建交互器,用于响应鼠标键盘等用户输入
vtkNew<vtkRenderWindowInteractor> iren;
// 关联交互器与渲染窗口
iren->SetRenderWindow(renderWindow);
// 启用或禁用多重采样抗锯齿功能,参数与GL_MAX_SAMPLES相关
renderWindow->SetMultiSamples(0);
// 初始化交互器
iren->Initialize();
// 开始监听用户交互事件
iren->Start();
return EXIT_SUCCESS;
}
4. 演示效果




