Porta C++20 multiplataforma da popular biblioteca Javascript 3D three.js r129.
A maior parte da biblioteca principal foi portada, incluindo recursos avançados de renderização, embora ainda haja muito a ser feito.
Baseado em Windows, Linux, MacOS, MinGW e com Emscripten.
Porque divertido.
threepp
vem com todas as dependências principais necessárias.
Use o CMake para configuração e construção do projeto.
Observe que você também pode usar uma instalação de sistema do GLFW3 se desejar ou tiver problemas com a configuração do pacote, passando -DTHREEPP_USE_EXTERNAL_GLFW=ON
para 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
No entanto, alguns dos exemplos (e cabeçalhos) requerem dependências adicionais. Para fazer uso de todos os recursos e habilitar/construir todos os exemplos, o uso do vcpkg é incentivado.
Chame CMake com -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
Adicione recursos opcionais listando-os com -DVCPKG_MANIFEST_FEATURES=feature1;feature2
Consulte vcpkg.json para obter os recursos disponíveis.
Observe, entretanto, que no MinGW você precisará especificar o trio 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.
Passe para o CMake:
-DCMAKE_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Ao usar o vcpkg, entretanto, faça:
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Isso gerará versões .html de um subconjunto de exemplos a serem carregados em um navegador.
Ao consumir threepp
em seu próprio aplicativo, alguns cabeçalhos exigirão dependências adicionais para serem compilados.
Cabeçalho | Dependência | Descrição |
---|---|---|
AssimpLoader | assimp | Importe uma grande variedade de formatos 3D diferentes |
ImguiContexto | imgui | Utilitário ImGUI |
Em geral, você descobrirá que as classes de matemática são tipos de valor, enquanto threepp
espera ponteiros inteligentes para outros tipos. Por conveniência, geometrias, materiais etc. possuem uma função static ::create
que retorna um std::shared_ptr
. Portanto, você não precisa necessariamente lidar explicitamente com a memória usando threepp
. Além disso, materiais, geometrias e texturas são automaticamente descartados quando saem do escopo. Yay!
# 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á disponível como um pacote CMake e pode ser consumido de várias maneiras.
threepp
é compatível com FetchContent
do 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)
Esta é a abordagem preferida, pois permite que os usuários atualizem a versão de três pp desejada à vontade.
Um exemplo é fornecido aqui. Veja também esta demonstração, que também usa WxWidgets como sistema de janela.