Кроссплатформенный порт C++20 популярной 3D-библиотеки Javascript Three.js r129.
Большая часть основной библиотеки была перенесена, включая расширенные возможности рендеринга, однако многое еще предстоит сделать.
Создан на Windows, Linux, MacOS, MinGW и Emscripten.
Потому что весело.
threepp
поставляется в комплекте со всеми необходимыми базовыми зависимостями.
Используйте CMake для настройки и сборки проекта.
Обратите внимание, что вы также можете использовать системную установку GLFW3, если хотите или у вас есть проблемы с комплексной установкой, передав -DTHREEPP_USE_EXTERNAL_GLFW=ON
в CMake.
cmake . -A x64 -B build -DCMAKE_BUILD_TYPE= " Release "
cmake --build build --config " Release "
cmake . -B build -DCMAKE_BUILD_TYPE= " Release "
cmake --build build
Однако некоторые примеры (и заголовки) требуют дополнительных зависимостей. Чтобы использовать все функции и включить/создать все примеры, рекомендуется использовать vcpkg.
Вызовите CMake с помощью -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
Добавьте дополнительные функции, перечислив их с помощью -DVCPKG_MANIFEST_FEATURES=feature1;feature2
См. vcpkg.json, чтобы узнать о доступных функциях.
Однако обратите внимание, что в MinGW вам необходимо указать триплет vcpkg:
-DVCPKG_TARGET_TRIPLET=x64-mingw-[static | dynamic] # choose either `static` or `dynamic`.
-DVCPKG_HOST_TRIPLET=x64-mingw-[static | dynamic] # <-- needed only if MSVC cannot be found.
Перейдите в CMake:
-DCMAKE_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Однако при использовании vcpkg выполните:
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Это создаст .html-версии подмножества примеров, которые будут загружены в браузер.
При использовании threepp
в вашем собственном приложении для компиляции некоторых заголовков потребуются дополнительные зависимости.
Заголовок | Зависимость | Описание |
---|---|---|
AssimpLoader | ассимп | Импортируйте множество различных 3D-форматов. |
ImguiContext | образ | Утилита ImGUI |
В общем, вы обнаружите, что математические классы являются типами значений, тогда как threepp
ожидает интеллектуальные указатели для других типов. Для удобства геометрия, материалы и т. д. имеют статическую функцию ::create
, которая возвращает std::shared_ptr
. Таким образом, вам не обязательно обращаться с памятью явно с помощью threepp
. Более того, материалы, геометрия и текстуры автоматически удаляются, когда они выходят за рамки. Ура!
# include " threepp/threepp.hpp "
using namespace threepp ;
auto createBox ( const Vector3& pos, const Color& color) {
auto geometry = BoxGeometry::create ();
auto material = MeshPhongMaterial::create ();
material-> color = color;
auto box = Mesh::create (geometry, material);
box-> position . copy (pos);
return box;
}
auto createPlane () {
auto planeGeometry = PlaneGeometry::create ( 5 , 5 );
auto planeMaterial = MeshLambertMaterial::create ();
planeMaterial-> color = Color::gray;
planeMaterial-> side = Side::Double;
auto plane = Mesh::create (planeGeometry, planeMaterial);
plane-> position . y = - 1 ;
plane-> rotateX ( math::degToRad ( 90 ));
return plane;
}
int main () {
Canvas canvas ( " Demo " );
GLRenderer renderer{canvas. size ()};
auto scene = Scene::create ();
auto camera = PerspectiveCamera::create ( 75 , canvas. aspect (), 0 . 1f , 100 );
camera-> position . z = 5 ;
OrbitControls controls{*camera, canvas};
auto light = HemisphereLight::create ();
scene-> add (light);
auto plane = createPlane ();
scene-> add (plane);
auto group = Group::create ();
group-> add ( createBox ({- 1 , 0 , 0 }, Color::green));
group-> add ( createBox ({ 1 , 0 , 0 }, Color::red));
scene-> add (group);
canvas. onWindowResize ([&](WindowSize size) {
camera-> aspect = size. aspect ();
camera-> updateProjectionMatrix ();
renderer. setSize (size);
});
Clock clock ;
canvas. animate ([&]() {
float dt = clock . getDelta ();
group-> rotation . y += 1 . f * dt;
renderer. render (*scene, *camera);
});
}
Threepp доступен в виде пакета CMake, и его можно использовать разными способами.
threepp
совместим с FetchContent
CMake:
include (FetchContent)
set (THREEPP_BUILD_TESTS OFF )
set (THREEPP_BUILD_EXAMPLES OFF )
FetchContent_Declare(
threepp
GIT_REPOSITORY https://github.com/markaren/threepp.git
GIT_TAG tag_or_commit_hash
)
FetchContent_MakeAvailable(threepp)
#...
target_link_libraries (main PUBLIC threepp::threepp)
Это предпочтительный подход, поскольку он позволяет пользователям обновлять целевую версию Threepp по своему желанию.
Пример приведен здесь. См. также эту демонстрацию, в которой в качестве оконной системы дополнительно используется WxWidgets.