流行的 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 作为窗口系统。