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

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

Учимся создавать свою первую 3D модель тора в OpenCASCADE

В этой статье мы рассмотрим создание нашего первого приложения на OpenCASCADE в C++. Мы построим 3D модель тора и выведем её в файлы 2-х форматов: STEP и STL.

OpenCASCADE - это ядро геометрического моделирования в области систем автоматизированного проектирования (САПР). Например, с использованием библиотек OpenCASCADE создан свободный САПР FreeCAD.

Вывод созданной модели в файл позволит нам не делать самостоятельно визуализацию модели. Визуализируем с помощью внешних приложений. Формат STEP используется в САПР для хранения параметрических моделей. Для его просмотра будем использовать FreeCAD. Формат STL хранит полигональную модель, которую мы откроем в Blender.

Для работы потребуется: компилятор C++; библиотека OpenCASCADE, соответствующая компилятору; среда разработки QtCreator (или любая другая); средства просмотра 3D моделей: FreeCAD или Blender.

Статья доступна в видео-формате: YouTube | ВКонтакте

Читайте больше о разработке в моем Телеграм: 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)“. Модель импортируются в текущую сцену.