Как создать 3D модель с помощью OpenCASCADE на C++ в среде QtCreator
Учимся создавать свою первую 3D модель тора в OpenCASCADE
Table of contents
В этой статье мы рассмотрим создание нашего первого приложения на 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)“. Модель импортируются в текущую сцену.