Как создать 3D модель с помощью OpenCASCADE на C++ в среде QtCreator

Table of contents

В этой статье мы рассмотрим создание нашего первого приложения на OpenCASCADE в C++. Мы построим 3D модель тора и выведем её в файлы 2-х форматов: STEP и STL.
OpenCASCADE - это ядро геометрического моделирования в области систем автоматизированного проектирования (САПР). Например, с использованием библиотек OpenCASCADE создан свободный САПР FreeCAD.
Вывод созданной модели в файл позволит нам не делать самостоятельно визуализацию модели. Визуализируем с помощью внешних приложений. Формат STEP используется в САПР для хранения параметрических моделей. Для его просмотра будем использовать FreeCAD. Формат STL хранит полигональную модель, которую мы откроем в Blender.
Для работы потребуется: компилятор C++; библиотека OpenCASCADE, соответствующая компилятору; среда разработки QtCreator (или любая другая); средства просмотра 3D моделей: FreeCAD или Blender.
Статья доступна в видео-формате: YouTube | ВКонтакте
Читайте больше о разработке в моем Телеграм: https://t.me/mediocre_developer
Исходный код
Для начала создадим новый проект C++ в QtCreator на базе CMake.
main.cpp
Исходный код построения тора возьмем из коллекции примеров occBasicSamples. Достаточно скопировать код ниже и вставить его в main.cpp
, заменив шаблонный код, сгенерированный QtCreator.
#include <gp_Ax2.hxx>
#include <TopoDS_Shape.hxx>
#include <BRepPrimAPI_MakeTorus.hxx>
#include <BRepMesh_IncrementalMesh.hxx>
#include <STEPControl_Writer.hxx>
#include <StlAPI_Writer.hxx>
#include <VrmlAPI_Writer.hxx>
int main()
{
gp_Ax2 anAxis;
anAxis.SetLocation(gp_Pnt(0.0, 0.0, 0.0));
TopoDS_Shape aTorus = BRepPrimAPI_MakeTorus(anAxis, 3.0, 1.0).Shape();
BRepMesh_IncrementalMesh(aTorus, 0.1, Standard_True);
StlAPI_Writer aStlWriter;
aStlWriter.Write(aTorus, "aTorus.stl");
STEPControl_Writer aStepWriter;
aStepWriter.Transfer(aTorus,STEPControl_AsIs);
aStepWriter.Write("aTorus.stp");
return 0;
}
Рассмотрим код подробнее.
Для начала мы создаем правостороннюю координатную систему gp_Ax2 с основанием в точке gp_Pnt с координатами (0.0, 0.0, 0.0) для позиционирования и ориентации модели тора в пространстве.
gp_Ax2 anAxis;
anAxis.SetLocation(gp_Pnt(0.0, 0.0, 0.0));
С помощь класса BRepPrimAPI_MakeTorus создаем модель тора, указав ось, радиус окружности тора (3.0) и радиус окружности сечения (1.0). Тип создаваемой модели TopoDS_Shape хранит в себе всю геометрическую и топологическую информацию о ней.
TopoDS_Shape aTorus = BRepPrimAPI_MakeTorus(anAxis, 3.0, 1.0).Shape();
Теперь создадим триангуляционную сетку BRepMesh_IncrementalMesh модели тора. Укажем линейную точность триангуляции равной 0.1
. Чем ниже значение, тем более мелкая и точная сетка будет сгенерирована. Следующий параметр Standard_True указывает, что точность будет рассчитываться не в абсолютных значениях, а в относительных - относительно размера модели. Она сгенерируется и сохранится внутри объекта aTorus
.
BRepMesh_IncrementalMesh(aTorus, 0.1, Standard_True);
Остается записать созданную модель в 2 файла: STL и STEP. Для этого воспользуемся классами StlAPI_Writer и STEPControl_Writer.
StlAPI_Writer aStlWriter;
aStlWriter.Write(aTorus, "aTorus.stl");
STEPControl_Writer aStepWriter;
aStepWriter.Transfer(aTorus,STEPControl_AsIs);
aStepWriter.Write("aTorus.stp");
CMakeLists.txt
Сборку программы выполним с помощью CMake. Открываем файл проекта CMakeLists.txt
и заменяем его содержимое на код ниже.
cmake_minimum_required(VERSION 3.5)
project(occ_example LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(OpenCASCADE COMPONENTS FoundationClasses REQUIRED)
find_package(OpenCASCADE COMPONENTS ModelingAlgorithms REQUIRED)
find_package(OpenCASCADE COMPONENTS DataExchange REQUIRED)
add_executable(occ_example main.cpp)
target_link_directories(occ_example PRIVATE ${OpenCASCADE_LIBRARY_DIR})
target_link_libraries(occ_example PRIVATE
TKMath
TKPrim
TKTopAlgo
TKMesh
TKStep
TKSTL
)
Ключевых моментов здесь два. Первое - это поиск пакетов OpenCASCADE в системе. При правильной настройке среды здесь не должно возникнуть проблем.
find_package(OpenCASCADE COMPONENTS FoundationClasses REQUIRED)
find_package(OpenCASCADE COMPONENTS ModelingAlgorithms REQUIRED)
find_package(OpenCASCADE COMPONENTS DataExchange REQUIRED)
Если CMake не сможет обнаружить OpenCASCADE и покажет ошибку как на скриншоте ниже, то нужно указать путь к cmake-файлам OpenCASCADE через переменную CMAKE_PREFIX_PATH. Подробнее я это разбирал в отдельном видео: YouTube | ВКонтакте.
Второй момент - линковка библиотек OpenCASCADE. Сначала через target_link_directories()
мы указываем путь, где CMake должен искать библиотеки для проекта. А потом перечисляем нужные библиотеки в target_link_libraries()
.
target_link_directories(occ_example PRIVATE ${OpenCASCADE_LIBRARY_DIR})
target_link_libraries(occ_example PRIVATE
TKMath
TKPrim
TKTopAlgo
TKMesh
TKStep
TKSTL
)
OpenCASCADE содержит множество библиотек. Чтобы понять, какие именно библиотеки нам нужны, мы можем обращаться к документации используемых классов. В верхней части страницы можно увидеть, к какому компоненту относится класс, и в какую библиотеку он включен.
Визуализация
При запуске программы будет создано 2 файла: aTorus.stp
и aTorus.stl
. Для просмотра содержимого файлов воспользуемся соответствующими программами.
FreeCAD
Для открытия файла STEP во FreeCAD достаточно использовать меню “Файл → Открыть…”. Модель загрузится из файла на основной экран.
Blender
Для открытия файла STL в Blender нужно воспользоваться процедурой импорта “File → Import → STL (.stl)“. Модель импортируются в текущую сцену.
Subscribe to my newsletter
Read articles from Alexander Trotsenko directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Alexander Trotsenko
Alexander Trotsenko
Software Developer