(46)VTK C++开发示例 --- 加载CML文件

文章目录

    • [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. 演示效果






相关推荐
ouliten2 小时前
C++笔记:流式异步日志库
c++·笔记
橘子真甜~3 小时前
C/C++ Linux网络编程13 - 传输层TCP协议详解(面向字节流和有连接)
linux·运维·服务器·c语言·网络·c++·tcp/ip
lightqjx3 小时前
【算法】双指针
c++·算法·leetcode·双指针
历程里程碑3 小时前
C++ 7vector:动态数组的终极指南
java·c语言·开发语言·数据结构·c++·算法
Bruce_kaizy4 小时前
C++树形数据结构————树状数组、线段树中“逆序对”的问题
开发语言·数据结构·c++
FMRbpm4 小时前
用栈实现队列
数据结构·c++·新手入门
添砖java‘’4 小时前
常见的进程间通信方式详解
linux·c++·操作系统·信息与通信·进程通信
AA陈超4 小时前
LyraStarterGame_5.6 Experience系统加载流程详细实现
c++·笔记·学习·ue5·虚幻引擎·lyra
90后小陈老师4 小时前
Unity教学 项目3 3D坦克大战
3d·unity·游戏引擎