Plattformübergreifende C++20-Portierung der beliebten Javascript-3D-Bibliothek three.js r129.
Der Großteil der Kernbibliothek wurde portiert, einschließlich erweiterter Rendering-Funktionen, es bleibt jedoch noch viel zu tun.
Baut auf Windows, Linux, MacOS, MinGW und mit Emscripten.
Weil es Spaß macht.
threepp
wird mit allen erforderlichen Kernabhängigkeiten gebündelt geliefert.
Verwenden Sie CMake für die Projektkonfiguration und -erstellung.
Beachten Sie, dass Sie auch eine Systeminstallation von GLFW3 verwenden können, wenn Sie das gebündelte Setup wünschen oder Probleme damit haben, indem Sie -DTHREEPP_USE_EXTERNAL_GLFW=ON
an CMake übergeben.
cmake . -A x64 -B build -DCMAKE_BUILD_TYPE= " Release "
cmake --build build --config " Release "
cmake . -B build -DCMAKE_BUILD_TYPE= " Release "
cmake --build build
Einige Beispiele (und Header) erfordern jedoch zusätzliche Abhängigkeiten. Um alle Funktionen nutzen zu können und alle Beispiele zu aktivieren/erstellen, wird die Verwendung von vcpkg empfohlen.
Rufen Sie CMake mit -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
auf
Fügen Sie optionale Funktionen hinzu, indem Sie sie mit -DVCPKG_MANIFEST_FEATURES=feature1;feature2
auflisten
Verfügbare Funktionen finden Sie in vcpkg.json.
Beachten Sie jedoch, dass Sie unter MinGW das vcpkg-Triplett angeben müssen:
-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.
An CMake übergeben:
-DCMAKE_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Gehen Sie bei Verwendung von vcpkg jedoch wie folgt vor:
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Dadurch werden .html-Versionen einer Teilmenge der Beispiele generiert, die in einen Browser geladen werden sollen.
Wenn Sie threepp
in Ihrer eigenen Anwendung nutzen, erfordern einige Header zum Kompilieren zusätzliche Abhängigkeiten.
Kopfzeile | Abhängigkeit | Beschreibung |
---|---|---|
AssimpLoader | Assimp | Importieren Sie eine Vielzahl unterschiedlicher 3D-Formate |
ImguiContext | imgui | ImGUI-Dienstprogramm |
Im Allgemeinen werden Sie feststellen, dass Mathematikklassen Werttypen sind, während threepp
für andere Typen intelligente Zeiger erwartet. Der Einfachheit halber gibt es für Geometrien, Materialien usw. eine statische ::create
-Funktion, die einen std::shared_ptr
zurückgibt. Daher müssen Sie den Speicher nicht unbedingt explizit mit threepp
verwalten. Darüber hinaus werden Materialien, Geometrien und Texturen automatisch entsorgt, wenn sie den Gültigkeitsbereich verlassen. Juhuu!
# 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 ist als CMake-Paket verfügbar und kann auf verschiedene Arten genutzt werden.
threepp
ist mit CMakes FetchContent
kompatibel:
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)
Dies ist der bevorzugte Ansatz, da Benutzer so die gewünschte ThreePP-Version nach Belieben aktualisieren können.
Ein Beispiel finden Sie hier. Sehen Sie sich auch diese Demo an, die zusätzlich WxWidgets als Fenstersystem verwendet.