منفذ C++20 متعدد المنصات لمكتبة Javascript ثلاثية الأبعاد الشهيرة three.js r129.
لقد تم نقل معظم المكتبة الأساسية، بما في ذلك إمكانات العرض المتقدمة، ولكن لا يزال هناك الكثير مما يتعين القيام به.
يعتمد على أنظمة التشغيل Windows وLinux وMacOS وMinGW ومع Emscripten.
لأن المتعة.
يأتي threepp
مزودًا بجميع التبعيات الأساسية المطلوبة.
استخدم CMake لتكوين المشروع وبناءه.
لاحظ أنه يمكنك أيضًا استخدام تثبيت نظام GLFW3 إذا كنت تريد أو لديك مشكلات في الإعداد المجمع عن طريق تمرير -DTHREEPP_USE_EXTERNAL_GLFW=ON
إلى 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
ومع ذلك، تتطلب بعض الأمثلة (والرؤوس) تبعيات إضافية. للاستفادة من كافة الميزات ولتمكين/إنشاء كافة الأمثلة، يُنصح باستخدام vcpkg.
اتصل بـ CMake باستخدام -DCMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.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 | asimp | استيراد مجموعة واسعة من التنسيقات ثلاثية الأبعاد المختلفة |
ImguiContext | com.imgui | فائدة 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
متوافق مع 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)
هذا هو الأسلوب المفضل، لأنه يمكّن المستخدمين من تحديث إصدار threepp المستهدف حسب الرغبة.
ويرد مثال هنا. راجع أيضًا هذا العرض التوضيحي، والذي يستخدم أيضًا WxWidgets كنظام Window.