更多精彩内容 |
---|
👉内容导航 👈 |
👉VTK开发 👈 |
1. 概述
本文演示在Qt中不使用UI文件,通过VTK创建一个20面体,并通过vtkLookupTable为每个面设置不同的颜色。
QVTKOpenGLNativeWidget
是一个继承自QOpenGLWidget
的子类,专门用于在 Qt 应用程序中容纳vtkGenericOpenGLRenderWindow
进行渲染
用于创建独立于平台的 OpenGL 渲染窗口。它是
vtkRenderWindow
的子类,专门设计用于与现代 OpenGL 渲染管道和外部窗口系统(如 Qt、wxWidgets 等)集成。以下是其主要特点和功能:
- 跨平台支持:
- 提供与不同窗口系统(如 Windows、macOS 和 Linux)兼容的渲染窗口。
- 独立于具体的窗口系统实现。
- 现代 OpenGL 支持:
- 专为现代 OpenGL 渲染管道设计,支持 OpenGL 3.2 及以上版本。
- 提供高性能的渲染能力,适合复杂的 3D 可视化。
- 与 GUI 框架集成:
- 可与 Qt、wxWidgets 等 GUI 框架无缝集成。
- 常与 QVTKOpenGLNativeWidget 一起使用,用于在 Qt 应用中嵌入 VTK 渲染窗口。
- 灵活的上下文管理:
- 支持用户自定义 OpenGL 上下文。
- 提供对 OpenGL 状态的直接访问,便于高级用户进行自定义渲染。
- 事件处理:
- 支持鼠标、键盘等交互事件的处理。
- 可与 VTK 的交互器(如
vtkRenderWindowInteractor
)结合使用。- 使用场景
- 在需要与 GUI 框架集成的应用中(如 Qt 应用)。
- 在需要跨平台支持的 3D 可视化项目中。
- 在需要现代 OpenGL 渲染功能的高性能渲染场景中。
- 注意事项
- 使用前需要确保 OpenGL 环境已正确配置。
- 在与 GUI 框架集成时,需正确设置 OpenGL 上下文格式(如通过
QSurfaceFormat
)。
用于生成柏拉图多面体的几何形状。柏拉图多面体是具有对称性的三维几何体,每个面都是相同的正多边形。该类允许用户生成以下五种柏拉图多面体:
- 四面体 (Tetrahedron) - 由 4 个正三角形组成。
- 立方体 (Cube) - 由 6 个正方形组成。
- 八面体 (Octahedron) - 由 8 个正三角形组成。
- 十二面体 (Dodecahedron) - 由 12 个正五边形组成。
- 二十面体 (Icosahedron) - 由 20 个正三角形组成。
主要功能和方法
SetSolidTypeToTetrahedron()
: 设置生成的多面体为四面体。SetSolidTypeToCube()
: 设置生成的多面体为立方体。SetSolidTypeToOctahedron()
: 设置生成的多面体为八面体。SetSolidTypeToDodecahedron()
: 设置生成的多面体为十二面体。SetSolidTypeToIcosahedron()
: 设置生成的多面体为二十面体。
环境 | 说明 |
---|---|
系统 | ubuntu22.04、windows11 |
cmake | 3.22、3.25 |
Qt | 5.14.2 |
编译器 | g++11.4、msvc2017 |
VTK | 9.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();
}