流行的 Javascript 3D 庫 Three.js r129 的跨平台 C++20 連接埠。
大多數核心庫已被移植,包括高級渲染功能,但仍有許多工作要做。
在 Windows、Linux、MacOS、MinGW 上建置並使用 Emscripten。
因為有趣。
threepp
捆綁了所有必要的核心相依性。
使用 CMake 進行專案配置和建置。
請注意,如果您想要捆綁設定或遇到捆綁設定問題,也可以透過將-DTHREEPP_USE_EXTERNAL_GLFW=ON
傳遞給 CMake 來使用 GLFW3 的系統安裝。
cmake . -A x64 -B build -DCMAKE_BUILD_TYPE= " Release "
cmake --build build --config " Release "
cmake . -B build -DCMAKE_BUILD_TYPE= " Release "
cmake --build build
但是,某些範例(和標題)需要額外的依賴項。為了利用所有功能並啟用/建構所有範例,鼓勵使用 vcpkg。
使用-DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
呼叫 CMake
透過使用-DVCPKG_MANIFEST_FEATURES=feature1;feature2
列出來新增可選功能
請參閱 vcpkg.json 以了解可用功能。
但請注意,在 MinGW 下,您需要指定 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.
傳遞給 CMake:
-DCMAKE_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
但是,當使用 vcpkg 時,請執行下列操作:
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE= " [path to emscripten]emsdkupstreamemscriptencmakeModulesPlatformEmscripten.cmake "
這將產生要在瀏覽器中載入的範例子集的 .html 版本。
在您自己的應用程式中使用threepp
時,某些標頭將需要額外的依賴項才能進行編譯。
標頭 | 依賴性 | 描述 |
---|---|---|
輔助載入器 | 阿辛普 | 匯入各種不同的 3D 格式 |
ImguiContext | 影像顯示 | ImGUI 實用程式 |
一般來說,您會發現數學類別是值類型,而threepp
則期望其他類型的智慧指標。為了方便起見,幾何圖形、材質等有靜態::create
函數,它會傳回std::shared_ptr
。因此,您不一定需要使用threepp
明確處理記憶體。此外,當材質、幾何形狀和紋理超出範圍時,它們會自動處理。耶!
# 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 可作為 CMake 套件使用,並且可以透過多種方式使用。
threepp
與 CMake 的FetchContent
相容:
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)
這是首選方法,因為它使用戶能夠隨意更新目標 Threepp 版本。
這裡提供了一個例子。另請參閱此演示,它另外使用 WxWidgets 作為視窗系統。