C
مكتبة رياضيات ثنائية الأبعاد وثلاثية الأبعاد محسنة للغاية، والمعروفة أيضًا باسم OpenGL Mathematics (glm) لـ `C` . يوفر cglm الكثير من الأدوات المساعدة لمساعدة العمليات الحسابية على أن تكون سريعة وسريعة في الكتابة. إنه صديق للمجتمع، فلا تتردد في طرح أي مشكلات أو أخطاء واجهتها.
يتم توثيق جميع الوظائف (الإصدارات المضمنة) والمعلمات تقريبًا داخل الرؤوس المقابلة.
التوثيق الكامل: http://cglm.readthedocs.io
glm_vec_dup -> glm_vec3_copy
CGLM_FORCE_DEPTH_ZERO_TO_ONE
و CGLM_FORCE_LEFT_HANDED
للتحكم في مساحة القصاصات. من المفترض أن تكون قادرًا على استخدام cglm مع Vulkan وDirectX وMetal الآن... راجع https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s إذا لم تكن على علم بمكتبة GLM الأصلية حتى الآن، فقد ترغب أيضًا في الاطلاع على: https://github.com/g-truc/glm
vec4
و mat4
. (ستكون هناك إصدارات غير محاذاة لاحقًا) لا يقوم cglm
بتخصيص أي ذاكرة على الكومة. لذلك لا يوفر أي مخصص. يجب عليك تخصيص الذاكرة لمعلمات الخروج أيضًا إذا قمت بتمرير مؤشر موقع الذاكرة. لا تنس أنه يجب محاذاة vec4 (أيضًا quat/ versor ) و mat4 (16 بايت)، لأن cglm يستخدم تعليمات SIMD لتحسين معظم العمليات إذا كانت متوفرة.
يدعم cglm كلاً من ARRAY API و STRUCT API ، لذا يمكنك إرجاع البنيات إذا كنت تستخدم struct api ( glms_
).
مثل بعض مكتبات الرسومات الأخرى (خاصة OpenGL)، تستخدم هذه المكتبة تخطيط العمود الرئيسي للاحتفاظ بالمصفوفات في الذاكرة. في المستقبل، قد تدعم المكتبة خيارًا لاستخدام تخطيط الصف الرئيسي، حاليًا، إذا كنت بحاجة إلى تخطيط الصف الرئيسي، فستحتاج إلى تبديل موضعه. |
لديك خياران لاستدعاء وظيفة/عملية: استدعاء مضمّن أو استدعاء مكتبة (رابط). يتم وضع علامة على جميع الوظائف تقريبًا في السطر (always_inline) لذا من المحتمل أن يكون المترجم مضمنًا. لاستدعاء الإصدارات المترجمة مسبقًا، ما عليك سوى استخدام glmc_
(يشير c إلى 'call') بدلاً من glm_
.
#include /* for inline */
#include /* for library call (this also includes cglm.h) */
mat4 rot , trans , rt ;
/* ... */
glm_mul ( trans , rot , rt ); /* inline */
glmc_mul ( trans , rot , rt ); /* call from library */
يتم تحسين معظم وظائف الرياضيات يدويًا باستخدام SSE2 إذا كان ذلك متاحًا، وإذا لم يكن كذلك؟ لا تقلق، هناك إصدارات غير sse لجميع العمليات
يمكنك تمرير المصفوفات والمتجهات كمصفوفة للوظائف بدلاً من الحصول على العنوان.
mat4 m = {
1 , 0 , 0 , 0 ,
0 , 1 , 0 , 0 ,
0 , 0 , 1 , 0 ,
0 , 0 , 0 , 1
};
glm_translate ( m , ( vec3 ){ 1.0f , 0.0f , 0.0f });
تحتوي المكتبة على وظائف mat4 mul وعكسية للأغراض العامة، وتحتوي أيضًا على بعض النماذج الخاصة (المُحسّنة) لهذه الوظائف لمصفوفات التحويلات التقاربية. إذا كنت تريد مضاعفة مصفوفتي تحويل متقاربين، فيمكنك استخدام glm_mul بدلاً من glm_mat4_mul وglm_inv_tr (ROT + TR) بدلاً من glm_mat4_inv
/* multiplication */
mat4 modelMat ;
glm_mul ( T , R , modelMat );
/* othonormal rot + tr matrix inverse (rigid-body) */
glm_inv_tr ( modelMat );
تعمل واجهة برمجة تطبيقات البنية على النحو التالي، لاحظ اللاحقة s
في الأنواع، والبادئة glms_
في الوظائف، والبادئة GLMS_
في الثوابت:
#include
mat4s mat = GLMS_MAT4_IDENTITY_INIT ;
mat4s inv = glms_mat4_inv ( mat );
تأخذ الدوال الهيكلية بشكل عام معلماتها كقيم وترجع نتائجها، بدلاً من أخذ المؤشرات والكتابة إلى المعلمات الخارجية. هذا يعني أن المعلمات الخاصة بك يمكن أن تكون عادةً const
، إذا كنت مهتمًا بذلك.
الأنواع المستخدمة هي في الواقع اتحادات تسمح بالوصول إلى نفس البيانات بعدة طرق. تتضمن إحدى هذه الطرق هياكل مجهولة، متاحة منذ C11. يدعمه MSVC أيضًا لإصدارات C الأقدم خارج الصندوق ويفعل ذلك دول مجلس التعاون الخليجي/Clang إذا قمت بتمكين -fms-extensions
. لتمكين هذه الهياكل المجهولة بشكل صريح، #define CGLM_USE_ANONYMOUS_STRUCT
إلى 1
، لتعطيلها، إلى 0
. للتوافق مع الإصدارات السابقة، يمكنك أيضًا #define CGLM_NO_ANONYMOUS_STRUCT
(القيمة غير ذات صلة) لتعطيلها. إذا لم تحدد بشكل صريح، فسيقوم cglm بإجراء أفضل تخمين بناءً على المترجم الخاص بك وإصدار C الذي تستخدمه.
$ mkdir build
$ cd build
$ cmake .. # [Optional] -DCGLM_SHARED=ON
$ make
$ sudo make install # [Optional]
option (CGLM_SHARED "Shared build" ON )
option (CGLM_STATIC "Static build" OFF )
option (CGLM_USE_C99 "" OFF ) # C11
option (CGLM_USE_TEST "Enable Tests" OFF ) # for make check - make test
وهذا لا يتطلب بناء أو تركيب cglm.
cmake_minimum_required ( VERSION 3.8.2)
project (Name >)
add_executable ( ${PROJECT_NAME} src/main.c)
target_link_libraries ( ${LIBRARY_NAME} PRIVATE
cglm_headers)
add_subdirectory (external/cglm/ EXCLUDE_FROM_ALL )
cmake_minimum_required ( VERSION 3.8.2)
project (Name >)
add_executable ( ${PROJECT_NAME} src/main.c)
target_link_libraries ( ${LIBRARY_NAME} PRIVATE
cglm)
add_subdirectory (external/cglm/)
# or you can use find_package to configure cglm
نظرًا لاستخدام الدوال الرياضية مثل sinf
، فلا يمكن استهداف wasm32-unknown-unknown
، بل يجب استخدام أحد Wasi-sdk أو emscripten.
يجب ملاحظة أن الإصدار المشترك غير مدعوم حتى الآن لـ WebAssembly.
للحصول على دعم simd128، أضف -msimd128
إلى CMAKE_C_FLAGS
، في سطر الأوامر -DCMAKE_C_FLAGS="-msimd128"
.
بالنسبة للاختبارات، سيظل خيار cmake CGLM_USE_TEST
يعمل، وستحتاج إلى وقت تشغيل Wasi لتشغيل الاختبارات، راجع ملف ci config الخاص بنا للحصول على مثال تفصيلي.
$ cmake ..
-DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake
-DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0
حيث /path/to/wasi-sdk-19.0/
هو المسار المستخرج من Wasi sdk.
في هذه الحالة، سيتم بشكل افتراضي إنشاء بناء ثابت.
$ emcmake cmake ..
-DCMAKE_EXE_LINKER_FLAGS= " -s STANDALONE_WASM "
-DCGLM_STATIC=ON
emcmake
هنا هو غلاف cmake لـ Emscripten من emsdk المثبت.
$ meson build # [Optional] --default-library=static
$ cd build
$ ninja
$ sudo ninja install # [Optional]
c_std = c11
buildtype = release
default_library = shared
build_tests = true # to run tests: ninja test
# Clone cglm or create a cglm.wrap under /subprojects
project ( ' name ' , ' c ' )
cglm_dep = dependency ( ' cglm ' , fallback : ' cglm ' , ' cglm_dep ' )
executable ( ' exe ' , ' src/main.c ' , dependencies : cglm_dep)
حاليًا يتم دعم خيارات البناء الافتراضية فقط. أضف تبعية cglm إلى مشروعك:
...
Package (
...
dependencies : [
...
. package ( url : " https://github.com/recp/cglm " , . branch ( " master " ) ) ,
]
...
)
أضف الآن cgml باعتباره تبعية لهدفك. اختيارات المنتج هي:
...
. target (
...
dependencies : [
...
. product ( name : " cglm " , package : " cglm " ) ,
]
...
)
...
$ sh autogen.sh
$ ./configure
$ make
$ make check # [Optional]
$ [sudo] make install # [Optional]
سيؤدي هذا أيضًا إلى تثبيت ملفات pkg-config حتى تتمكن من استخدام pkg-config --cflags cglm
و pkg-config --libs cglm
لاسترداد إشارات المترجم والرابط.
سيتم تثبيت الملفات في البادئة المحددة (عادةً /usr/local
بشكل افتراضي على Linux)، ولكن قد لا يتم تكوين pkg-config الخاص بك للتحقق من هناك فعليًا. يمكنك معرفة مكان ظهوره عن طريق تشغيل pkg-config --variable pc_path pkg-config
وتغيير المسار الذي تم تثبيت الملفات إليه عبر ./configure --with-pkgconfigdir=/your/path
. وبدلاً من ذلك، يمكنك إضافة مسار البادئة إلى متغير البيئة PKG_CONFIG_PATH
الخاص بك.
توجد ملفات البناء وملفات المشاريع ذات الصلة بنظام Windows في مجلد win
، تأكد من وجودك داخل مجلد cglm/win
. تم تمكين تحليل التعليمات البرمجية، لذلك قد يستغرق الأمر بعض الوقت للإنشاء.
$ cd win
$ . build.bat
إذا لم يعمل msbuild
(بسبب الإصدار المتعدد VS)، فحاول الإنشاء باستخدام devenv
:
$ devenv cglm.sln / Build Release
يمكنك رؤية مشروع الاختبار في نفس ملف حل الاستوديو المرئي. يكفي تشغيل هذا المشروع لإجراء الاختبارات.
تحتاج أولاً إلى تثبيت Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html ثم:
$ cd docs
$ sphinx-build source build
سيقوم بتجميع المستندات في مجلد البناء، ويمكنك تشغيل ملف Index.html داخل تلك الوظيفة.
إذا كنت ترغب في استخدام الإصدارات المضمنة من الوظائف، فقم بتضمين الرأس الرئيسي
#include
سيتضمن الرأس جميع الرؤوس. ثم اتصل بالوظيفة التي تريدها، على سبيل المثال تدوير المتجه حسب المحور:
glm_vec3_rotate ( v1 , glm_rad ( 45 ), ( vec3 ){ 1.0f , 0.0f , 0.0f });
بعض الوظائف مثقلة :) على سبيل المثال يمكنك تطبيع المتجه:
glm_vec3_normalize ( vec );
سيؤدي هذا إلى تطبيع vec وتخزين المتجه الذي تم تسويته في vec
ولكن إذا كنت ستقوم بتخزين المتجه الذي تمت تسويته في ناقل آخر، فقم بذلك:
glm_vec3_normalize_to ( vec , result );
مثل هذه الوظيفة، قد ترى _to
postfix، تقوم هذه الوظيفة بتخزين النتائج إلى متغيرات أخرى وحفظ الذاكرة المؤقتة
لاستدعاء الإصدارات المترجمة مسبقًا، تتضمن الرأس مع c
postfix، c يعني الاتصال. الإصدارات المترجمة مسبقًا هي مجرد أغلفة.
#include
سيتضمن هذا الرأس جميع الرؤوس التي تحتوي على c postfix. تحتاج إلى استدعاء الوظائف باستخدام c posfix:
glmc_vec3_normalize ( vec );
يتم توثيق استخدام الوظيفة والمعلمات داخل الرؤوس ذات الصلة. قد ترى نفس المعلمة تم تمريرها مرتين في بعض الأمثلة مثل هذا:
glm_mat4_mul ( m1 , m2 , m1 );
/* or */
glm_mat4_mul ( m1 , m1 , m1 );
المعلمتان الأوليان هما [في] والأخيرة هي [خارج] المعلمة. بعد ضرب m1 و m2 , يتم تخزين النتيجة في m1 . ولهذا السبب نرسل m1 مرتين. يمكنك تخزين النتيجة في مصفوفة مختلفة، وهذا مجرد مثال.
mat4 proj , view , model , mvp ;
/* init proj, view and model ... */
glm_mat4_mul ( proj , view , viewProj );
glm_mat4_mul ( viewProj , model , mvp );
mat4 proj , view , model , mvp ;
/* init proj, view and model ... */
glm_mat4_mulN (( mat4 * []){ & proj , & view , & model }, 3 , mvp );
mat4 عبارة عن مجموعة من vec4 و vec4 عبارة عن مجموعة من العوامات. تقبل وظائف glUniformMatrix4fv
float*
value
(المعلمة الأخيرة)، حتى تتمكن من تحويل mat4 إلى تعويم* أو يمكنك تمرير العمود الأول من المصفوفة كبداية لذاكرة المصفوفة:
الخيار 1: إرسال العمود الأول
glUniformMatrix4fv ( location , 1 , GL_FALSE , matrix [ 0 ]);
/* array of matrices */
glUniformMatrix4fv ( location , 1 , GL_FALSE , matrix [ 0 ][ 0 ]);
الخيار 2: تحويل المصفوفة إلى نوع المؤشر (صالح أيضًا لمصفوفات الأبعاد المتعددة)
glUniformMatrix4fv ( location , 1 , GL_FALSE , ( float * ) matrix );
يمكنك تمرير المصفوفات بنفس الطريقة إلى واجهات برمجة التطبيقات الأخرى، مثل Vulkan وDX...
المهام:
glm_umat4_mul
) هذا المشروع موجود بفضل جميع الأشخاص الذين ساهموا فيه. [يساهم].
شكرا لجميع الداعمين لدينا! [كن داعمًا]
ادعم هذا المشروع من خلال أن تصبح راعياً. سيظهر شعارك هنا مع رابط لموقعك على الويب. [كن راعيًا]
معهد ماساتشوستس للتكنولوجيا. تحقق من ملف الترخيص