人気のある 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
他の型のスマート ポインターを期待していることがわかります。便宜上、ジオメトリ、マテリアルなどにはstd::shared_ptr
を返す static ::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 バージョンを自由に更新できるため、推奨されるアプローチです。
ここでは例を示します。さらに WxWidgets をウィンドウ システムとして使用するこのデモも参照してください。