(42)VTK C++开发示例 ---渲染不同颜色的20面体


更多精彩内容
👉内容导航 👈
👉VTK开发 👈

1. 概述

本文演示在Qt中不使用UI文件,通过VTK创建一个20面体,并通过vtkLookupTable为每个面设置不同的颜色。


QVTKOpenGLNativeWidget:

  • QVTKOpenGLNativeWidget 是一个继承自 QOpenGLWidget 的子类,专门用于在 Qt 应用程序中容纳 vtkGenericOpenGLRenderWindow 进行渲染

vtkGenericOpenGLRenderWindow:

用于创建独立于平台的 OpenGL 渲染窗口。它是 vtkRenderWindow 的子类,专门设计用于与现代 OpenGL 渲染管道和外部窗口系统(如 Qt、wxWidgets 等)集成。以下是其主要特点和功能:

  1. 跨平台支持:
    • 提供与不同窗口系统(如 Windows、macOS 和 Linux)兼容的渲染窗口。
    • 独立于具体的窗口系统实现。
  2. 现代 OpenGL 支持:
    • 专为现代 OpenGL 渲染管道设计,支持 OpenGL 3.2 及以上版本。
    • 提供高性能的渲染能力,适合复杂的 3D 可视化。
  3. 与 GUI 框架集成:
    • 可与 Qt、wxWidgets 等 GUI 框架无缝集成。
    • 常与 QVTKOpenGLNativeWidget 一起使用,用于在 Qt 应用中嵌入 VTK 渲染窗口。
  4. 灵活的上下文管理:
    • 支持用户自定义 OpenGL 上下文。
    • 提供对 OpenGL 状态的直接访问,便于高级用户进行自定义渲染。
  5. 事件处理:
    • 支持鼠标、键盘等交互事件的处理。
    • 可与 VTK 的交互器(如 vtkRenderWindowInteractor)结合使用。
  6. 使用场景
  • 在需要与 GUI 框架集成的应用中(如 Qt 应用)。
  • 在需要跨平台支持的 3D 可视化项目中。
  • 在需要现代 OpenGL 渲染功能的高性能渲染场景中。
  1. 注意事项
    • 使用前需要确保 OpenGL 环境已正确配置。
    • 在与 GUI 框架集成时,需正确设置 OpenGL 上下文格式(如通过 QSurfaceFormat)。

vtkPlatonicSolidSource:

用于生成柏拉图多面体的几何形状。柏拉图多面体是具有对称性的三维几何体,每个面都是相同的正多边形。该类允许用户生成以下五种柏拉图多面体:

  1. 四面体 (Tetrahedron) - 由 4 个正三角形组成。
  2. 立方体 (Cube) - 由 6 个正方形组成。
  3. 八面体 (Octahedron) - 由 8 个正三角形组成。
  4. 十二面体 (Dodecahedron) - 由 12 个正五边形组成。
  5. 二十面体 (Icosahedron) - 由 20 个正三角形组成。

主要功能和方法

  • SetSolidTypeToTetrahedron(): 设置生成的多面体为四面体。
  • SetSolidTypeToCube(): 设置生成的多面体为立方体。
  • SetSolidTypeToOctahedron(): 设置生成的多面体为八面体。
  • SetSolidTypeToDodecahedron(): 设置生成的多面体为十二面体。
  • SetSolidTypeToIcosahedron(): 设置生成的多面体为二十面体。
环境说明
系统ubuntu22.04、windows11
cmake3.22、3.25
Qt5.14.2
编译器g++11.4、msvc2017
VTK9.4.1

2. CMake链接VTK

cmake_minimum_required(VERSION 3.16)

project(untitled LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(VTK_DIR E:/lib/VTK/lib/cmake/vtk-9.4) # 添加VTK库路径
# 查询VTK库
find_package(VTK COMPONENTS
CommonColor
CommonCore
FiltersSources
GUISupportQt
InteractionStyle
RenderingContextOpenGL2
RenderingCore
RenderingFreeType
RenderingGL2PSOpenGL2
RenderingOpenGL2
)

if (NOT VTK_FOUND)
  message("VTK not found")
endif()

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

add_executable(${PROJECT_NAME}
main.cpp
)
target_link_libraries(${PROJECT_NAME} Qt${QT_VERSION_MAJOR}::Widgets ${VTK_LIBRARIES}) # 链接库

include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME}
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

# 设置VTK模块自动初始化
vtk_module_autoinit(
TARGETS ${PROJECT_NAME}
MODULES ${VTK_LIBRARIES}
)

3. main.cpp文件

#include <QApplication>

#include <vtkActor.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkLookupTable.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPlatonicSolidSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkVersion.h>

#if VTK_VERSION_NUMBER >= 89000000000ULL
#define VTK890 1
#endif

#include <QSurfaceFormat>
#include <QVTKOpenGLNativeWidget.h>

/**
* @brief 创建一个新的 vtkLookupTable 对象,并设置其表格值和范围
*
* 该函数首先创建一个新的 vtkLookupTable 对象,并设置其表格大小和范围。
* 然后,它会设置表格中的各个值,这些值表示颜色映射表中不同的颜色值。
* 最后,函数返回这个设置好的 vtkLookupTable 对象。
*
* @return vtkNew<vtkLookupTable> 返回设置好的 vtkLookupTable 对象,包含20个颜色映射值
*/
vtkNew<vtkLookupTable> GetPlatonicLUT()
{
  vtkNew<vtkLookupTable> lut;
  lut->SetNumberOfTableValues(20);   // 设置表格大小为20
  lut->SetTableRange(0.0, 19.0);     // 设置表格范围为0-19
  lut->Build();                      // 构建颜色映射表

  // 变量1:索引 变量2:R 变量3:G 变量4:B 变量5:A
  lut->SetTableValue(0, 0.1, 0.1, 0.1);
  lut->SetTableValue(1, 0, 0, 1);
  lut->SetTableValue(2, 0, 1, 0);
  lut->SetTableValue(3, 0, 1, 1);
  lut->SetTableValue(4, 1, 0, 0);
  lut->SetTableValue(5, 1, 0, 1);
  lut->SetTableValue(6, 1, 1, 0);
  lut->SetTableValue(7, 0.9, 0.7, 0.9);
  lut->SetTableValue(8, 0.5, 0.5, 0.5);
  lut->SetTableValue(9, 0.0, 0.0, 0.7);
  lut->SetTableValue(10, 0.5, 0.7, 0.5);
  lut->SetTableValue(11, 0, 0.7, 0.7);
  lut->SetTableValue(12, 0.7, 0, 0);
  lut->SetTableValue(13, 0.7, 0, 0.7);
  lut->SetTableValue(14, 0.7, 0.7, 0);
  lut->SetTableValue(15, 0, 0, 0.4);
  lut->SetTableValue(16, 0, 0.4, 0);
  lut->SetTableValue(17, 0, 0.4, 0.4);
  lut->SetTableValue(18, 0.4, 0, 0);
  lut->SetTableValue(19, 0.4, 0, 0.4);
  return lut;
}

int main(int argc, char* argv[])
{
  // 设置 OpenGL上下文格式,以便与 QVTKOpenGLNativeWidget 兼容。
  QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());

  QApplication app(argc, argv);

  // 独立于平台的渲染窗口
  // 用于创建一个独立于平台的 OpenGL 渲染窗口。它是 vtkRenderWindow 的子类,
  // 专门设计用于与现代 OpenGL 渲染管道和外部窗口系统(如 Qt、wxWidgets 等)集成。
  vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
  QVTKOpenGLNativeWidget widget;   // 创建一个 QVTKOpenGLNativeWidget 对象,用于显示 VTK 渲染窗口
#if VTK890                           // VTK 8.9.0 及以上版本
  widget.setRenderWindow(renderWindow);
#else
  widget.SetRenderWindow(renderWindow);
#endif

  widget.resize(600, 600);

  vtkNew<vtkPlatonicSolidSource> source;   // 创建一个柏拉图多面体源对象
  source->SetSolidTypeToIcosahedron();     // 设置多面体类型为二十面体

  vtkNew<vtkPolyDataMapper> mapper;                      // 用于将多面体源对象映射到多边形数据
  mapper->SetInputConnection(source->GetOutputPort());   // 设置输入连接为多面体源对象的输出端口
  auto lut = GetPlatonicLUT();                           // 用于设置颜色映射表
  mapper->SetLookupTable(lut);                           // 设置颜色映射表
  mapper->SetScalarRange(0, 19);                         // 设置颜色映射范围为0-19

  vtkNew<vtkActor> actor;     // 创建一个演员对象,用于显示多面体
  actor->SetMapper(mapper);   // 将映射器设置为演员的映射器

  vtkNew<vtkRenderer> renderer;   // 创建一个渲染器对象,用于显示演员
  renderer->AddActor(actor);
  vtkNew<vtkNamedColors> colors;   // 创建一个 vtkNamedColors 对象,用于设置颜色
  renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());

#if VTK890                                          // VTK 8.9.0 及以上版本
  widget.renderWindow()->AddRenderer(renderer);   // 将渲染器添加到渲染窗口中
  widget.renderWindow()->SetWindowName("RenderWindowNoUIFile");
#else
  widget.GetRenderWindow()->AddRenderer(renderer);
  widget.GetRenderWindow()->SetWindowName("RenderWindowNoUIFile");
#endif
  widget.show();

  return app.exec();
}

4. 演示效果

在这里插入图片描述



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mahuifa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值