Port C++20 lintas platform dari pustaka 3D Javascript populer three.js r129.
Sebagian besar perpustakaan inti telah di-porting, termasuk kemampuan rendering tingkat lanjut, namun masih banyak yang harus dilakukan..
Dibangun di Windows, Linux, MacOS, MinGW dan dengan Emscripten.
Karena menyenangkan.
threepp
dibundel dengan semua dependensi inti yang diperlukan.
Gunakan CMake untuk konfigurasi dan pembangunan proyek.
Perhatikan bahwa Anda juga dapat menggunakan instalasi sistem GLFW3 jika Anda ingin atau mengalami masalah dengan paket penyiapan dengan meneruskan -DTHREEPP_USE_EXTERNAL_GLFW=ON
ke 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
Namun, beberapa contoh (dan header) memerlukan ketergantungan tambahan. Untuk memanfaatkan semua fitur dan mengaktifkan/membangun semua contoh, penggunaan vcpkg dianjurkan.
Panggil CMake dengan -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
Tambahkan fitur opsional dengan mencantumkannya dengan -DVCPKG_MANIFEST_FEATURES=feature1;feature2
Lihat vcpkg.json untuk fitur yang tersedia.
Namun, perhatikan bahwa di MinGW Anda harus menentukan 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.
Teruskan ke CMake:
-DCMAKE_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Namun, saat menggunakan vcpkg, lakukan:
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
Ini akan menghasilkan versi .html dari subset contoh yang akan dimuat di browser.
Saat menggunakan threepp
di aplikasi Anda sendiri, beberapa header akan memerlukan dependensi tambahan untuk dikompilasi.
Tajuk | Ketergantungan | Keterangan |
---|---|---|
AssimpLoader | asimp | Impor berbagai macam format 3D yang berbeda |
Konteks Imgui | imgui | Utilitas ImGUI |
Secara umum, Anda akan menemukan bahwa kelas matematika adalah tipe nilai, sementara threepp
mengharapkan petunjuk cerdas untuk tipe lainnya. Untuk kenyamanan, geometri, material, dll. memiliki fungsi static ::create
yang mengembalikan std::shared_ptr
. Jadi, Anda tidak perlu menangani memori secara eksplisit menggunakan threepp
. Selain itu, material, geometri, dan tekstur secara otomatis dibuang ketika berada di luar cakupan. Hore!
# 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 tersedia sebagai paket CMake dan dapat digunakan dengan berbagai cara.
threepp
kompatibel dengan 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)
Ini adalah pendekatan yang lebih disukai, karena memungkinkan pengguna memperbarui versi threepp yang ditargetkan sesuai keinginan.
Sebuah contoh diberikan di sini. Lihat juga demo ini, yang juga menggunakan WxWidgets sebagai sistem Window.