Puerto C++20 multiplataforma de la popular biblioteca Javascript 3D three.js r129.
La mayor parte de la biblioteca principal ha sido portada, incluidas las capacidades de renderizado avanzadas, aunque aún queda mucho por hacer.
Se basa en Windows, Linux, MacOS, MinGW y Emscripten.
Porque divertido.
threepp
viene con todas las dependencias principales necesarias.
Utilice CMake para la configuración y construcción de proyectos.
Tenga en cuenta que también puede utilizar una instalación del sistema de GLFW3 si desea o tiene problemas con la configuración incluida pasando -DTHREEPP_USE_EXTERNAL_GLFW=ON
a 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
Sin embargo, algunos de los ejemplos (y encabezados) requieren dependencias adicionales. Para hacer uso de todas las funciones y habilitar/crear todos los ejemplos, se recomienda el uso de vcpkg.
Llame a CMake con -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
Agregue funciones opcionales enumerándolas con -DVCPKG_MANIFEST_FEATURES=feature1;feature2
Consulte vcpkg.json para conocer las funciones disponibles.
Sin embargo, tenga en cuenta que en MinGW deberá especificar el triplete 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.
Pasar a CMake:
-DCMAKE_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Sin embargo, cuando utilice vcpkg, haga lo siguiente:
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Esto generará versiones .html de un subconjunto de ejemplos que se cargarán en un navegador.
Al consumir threepp
en su propia aplicación, algunos encabezados requerirán dependencias adicionales para poder compilarse.
Encabezamiento | Dependencia | Descripción |
---|---|---|
AssimpLoader | asimilar | Importe una amplia variedad de formatos 3D diferentes |
ImguiContexto | imgui | Utilidad ImGUI |
En general, encontrará que las clases de matemáticas son tipos de valores, mientras que threepp
espera sugerencias inteligentes para otros tipos. Por conveniencia, geometrías, materiales, etc. tienen una función estática ::create
que devuelve un std::shared_ptr
. Por lo tanto, no necesariamente es necesario manejar la memoria explícitamente usando threepp
. Además, los materiales, geometrías y texturas se eliminan automáticamente cuando quedan fuera de alcance. ¡Hurra!
# 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 como paquete CMake y se puede consumir de varias maneras.
threepp
es compatible con 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)
Este es el enfoque preferido, ya que permite a los usuarios actualizar la versión de tres páginas de destino a voluntad.
Aquí se proporciona un ejemplo. Vea también esta demostración, que además utiliza WxWidgets como sistema Windows.