Portage C++20 multiplateforme de la populaire bibliothèque Javascript 3D three.js r129.
La plupart de la bibliothèque principale a été portée, y compris les capacités de rendu avancées, mais il reste beaucoup à faire.
Construit sur Windows, Linux, MacOS, MinGW et avec Emscripten.
Parce que c'est amusant.
threepp
est fourni avec toutes les dépendances principales requises.
Utilisez CMake pour la configuration et la construction du projet.
Notez que vous pouvez également utiliser une installation système de GLFW3 si vous le souhaitez ou si vous rencontrez des problèmes avec la configuration fournie en transmettant -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
Cependant, certains exemples (et en-têtes) nécessitent des dépendances supplémentaires. Pour utiliser toutes les fonctionnalités et activer/construire tous les exemples, l'utilisation de vcpkg est encouragée.
Appelez CMake avec -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
Ajoutez des fonctionnalités facultatives en les répertoriant avec -DVCPKG_MANIFEST_FEATURES=feature1;feature2
Voir vcpkg.json pour les fonctionnalités disponibles.
Notez cependant que sous MinGW, vous devrez spécifier le triplet 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.
Passer à CMake :
-DCMAKE_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Cependant, lorsque vous utilisez vcpkg, faites :
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Cela générera des versions .html d'un sous-ensemble d'exemples à charger dans un navigateur.
Lorsque vous utilisez threepp
dans votre propre application, certains en-têtes nécessiteront des dépendances supplémentaires pour être compilés.
En-tête | Dépendance | Description |
---|---|---|
AssimpLoader | assimp | Importez une grande variété de formats 3D différents |
ImguiContexte | imgui | Utilitaire ImGUI |
En général, vous constaterez que les classes mathématiques sont des types valeur, tandis que threepp
attend des pointeurs intelligents pour d'autres types. Pour plus de commodité, les géométries, les matériaux, etc. ont une fonction static ::create
qui renvoie un std::shared_ptr
. Ainsi, vous n'avez pas nécessairement besoin de gérer explicitement la mémoire en utilisant threepp
. De plus, les matériaux, géométries et textures sont automatiquement supprimés lorsqu’ils sortent du champ d’application. Ouais!
# 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 est disponible sous forme de package CMake et peut être consommé de plusieurs manières.
threepp
est compatible avec FetchContent
de 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)
Il s’agit de l’approche privilégiée, car elle permet aux utilisateurs de mettre à jour à volonté la version 3pp ciblée.
Un exemple est fourni ici. Voir aussi cette démo, qui utilise en outre WxWidgets comme système Windows.