널리 사용되는 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
사용할 때 일부 헤더는 컴파일하기 위해 추가 종속성이 필요합니다.
헤더 | 의존 | 설명 |
---|---|---|
AssimpLoader | 흡수하다 | 다양한 3D 형식 가져오기 |
ImguiContext | 임구이 | ImGUI 유틸리티 |
일반적으로 수학 클래스는 값 유형인 반면 threepp
다른 유형에 대한 스마트 포인터를 기대합니다. 편의를 위해 기하학, 재료 등에는 std::shared_ptr
반환하는 정적 ::create
함수가 있습니다. 따라서 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 버전을 업데이트할 수 있으므로 선호되는 접근 방식입니다.
여기에 예가 나와 있습니다. WxWidget을 Window 시스템으로 추가로 사용하는 이 데모도 참조하세요.