C
Pustaka matematika 2D|3D yang sangat optimal, juga dikenal sebagai OpenGL Mathematics (glm) untuk `C` . CGLM menyediakan banyak kegunaan untuk membantu operasi matematika menjadi cepat dan cepat untuk ditulis. Ini ramah komunitas, jangan ragu untuk membawa masalah apa pun, bug yang Anda hadapi.
Hampir semua fungsi (versi sebaris) dan parameter didokumentasikan di dalam header terkait.
Dokumentasi lengkap: http://cglm.readthedocs.io
glm_vec_dup -> glm_vec3_copy
CGLM_FORCE_DEPTH_ZERO_TO_ONE
dan CGLM_FORCE_LEFT_HANDED
disediakan untuk mengontrol clipspace. Anda seharusnya dapat menggunakan cglm dengan Vulkan, DirectX, dan Metal sekarang... lihat https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s Jika Anda belum mengetahui perpustakaan GLM asli, Anda mungkin juga ingin melihat: https://github.com/g-truc/glm
vec4
dan mat4
harus selaras. (Akan ada versi yang tidak selaras nanti) cglm
tidak mengalokasikan memori apa pun di heap. Jadi itu tidak menyediakan pengalokasi apa pun. Anda juga harus mengalokasikan memori untuk parameter keluar jika Anda memberikan penunjuk lokasi memori. Jangan lupa bahwa vec4 (juga quat/ versor ) dan mat4 harus disejajarkan (16-byte), karena cglm menggunakan instruksi SIMD untuk mengoptimalkan sebagian besar operasi jika tersedia.
cglm mendukung ARRAY API dan STRUCT API , sehingga Anda dapat mengembalikan struct jika Anda menggunakan struct api ( glms_
).
Seperti beberapa perpustakaan grafis lainnya (terutama OpenGL), perpustakaan ini menggunakan tata letak Kolom-Mayor untuk menyimpan matriks di memori. Di masa mendatang, perpustakaan mungkin mendukung opsi untuk menggunakan tata letak baris-utama, SAAT INI jika Anda memerlukan tata letak baris-utama, Anda perlu mengubah urutannya. |
Anda memiliki dua opsi untuk memanggil suatu fungsi/operasi: panggilan inline atau perpustakaan (tautan) Hampir semua fungsi ditandai inline (always_inline) sehingga kompiler mungkin akan inline. Untuk memanggil versi yang telah dikompilasi sebelumnya, cukup gunakan glmc_
(c singkatan dari 'call') alih-alih 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 */
Sebagian besar fungsi matematika dioptimalkan secara manual dengan SSE2 jika tersedia, jika tidak? Jangan khawatir, ada versi non-sse dari semua operasi
Anda dapat meneruskan matriks dan vektor sebagai array ke fungsi daripada mendapatkan alamat.
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 });
Perpustakaan berisi fungsi mat4 mul dan invers tujuan umum, dan juga berisi beberapa bentuk khusus (dioptimalkan) dari fungsi ini untuk matriks transformasi affine. Jika Anda ingin mengalikan dua matriks transformasi affine, Anda dapat menggunakan glm_mul sebagai ganti glm_mat4_mul dan glm_inv_tr (ROT + TR) sebagai ganti glm_mat4_inv
/* multiplication */
mat4 modelMat ;
glm_mul ( T , R , modelMat );
/* othonormal rot + tr matrix inverse (rigid-body) */
glm_inv_tr ( modelMat );
Struktur API berfungsi sebagai berikut, perhatikan akhiran s
pada tipe, awalan glms_
pada fungsi, dan awalan GLMS_
pada konstanta:
#include
mat4s mat = GLMS_MAT4_IDENTITY_INIT ;
mat4s inv = glms_mat4_inv ( mat );
Fungsi struktur umumnya mengambil parameternya sebagai nilai dan mengembalikan hasilnya, daripada menggunakan pointer dan menuliskan parameternya. Itu berarti parameter Anda biasanya const
, jika Anda menyukainya.
Tipe yang digunakan sebenarnya adalah gabungan yang memungkinkan akses ke data yang sama dengan berbagai cara. Salah satu caranya melibatkan struktur anonim, tersedia sejak C11. MSVC juga mendukungnya untuk versi C sebelumnya dan GCC/Clang mendukungnya jika Anda mengaktifkan -fms-extensions
. Untuk mengaktifkan struktur anonim ini secara eksplisit, #define CGLM_USE_ANONYMOUS_STRUCT
menjadi 1
, untuk menonaktifkannya, menjadi 0
. Untuk kompatibilitas mundur, Anda juga dapat #define CGLM_NO_ANONYMOUS_STRUCT
(nilai tidak relevan) untuk menonaktifkannya. Jika Anda tidak menentukan secara eksplisit, cglm akan melakukan tebakan terbaik berdasarkan kompiler Anda dan versi C yang Anda gunakan.
$ 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
Ini tidak memerlukan bangunan atau instalasi 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
Karena fungsi matematika seperti sinf
digunakan, ini tidak dapat ditargetkan pada wasm32-unknown-unknown
, salah satu wasi-sdk atau emscripten harus digunakan.
Perlu diperhatikan bahwa build bersama belum didukung untuk WebAssembly.
Untuk dukungan simd128, tambahkan -msimd128
ke CMAKE_C_FLAGS
, di baris perintah -DCMAKE_C_FLAGS="-msimd128"
.
Untuk pengujian, opsi cmake CGLM_USE_TEST
akan tetap berfungsi, Anda memerlukan waktu proses wasi untuk menjalankan pengujian, lihat file konfigurasi ci kami untuk contoh detailnya.
$ cmake ..
-DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake
-DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0
Dimana /path/to/wasi-sdk-19.0/
adalah jalur untuk mengekstraksi wasi SDK.
Dalam hal ini secara default akan membuat build statis.
$ emcmake cmake ..
-DCMAKE_EXE_LINKER_FLAGS= " -s STANDALONE_WASM "
-DCGLM_STATIC=ON
emcmake
di sini adalah pembungkus cmake untuk Emscripten dari emsdk yang diinstal.
$ 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)
Saat ini hanya opsi build default yang didukung. Tambahkan ketergantungan cglm ke proyek Anda:
...
Package (
...
dependencies : [
...
. package ( url : " https://github.com/recp/cglm " , . branch ( " master " ) ) ,
]
...
)
Sekarang tambahkan cgml sebagai ketergantungan pada target Anda. Pilihan produknya adalah:
...
. target (
...
dependencies : [
...
. product ( name : " cglm " , package : " cglm " ) ,
]
...
)
...
$ sh autogen.sh
$ ./configure
$ make
$ make check # [Optional]
$ [sudo] make install # [Optional]
Ini juga akan menginstal file pkg-config sehingga Anda dapat menggunakan pkg-config --cflags cglm
dan pkg-config --libs cglm
untuk mengambil flag compiler dan linker.
File-file tersebut akan diinstal ke awalan yang diberikan (biasanya /usr/local
secara default di Linux), tetapi pkg-config Anda mungkin tidak dikonfigurasi untuk benar-benar memeriksa di sana. Anda dapat mengetahui di mana mencarinya dengan menjalankan pkg-config --variable pc_path pkg-config
dan mengubah jalur tempat file diinstal melalui ./configure --with-pkgconfigdir=/your/path
. Alternatifnya, Anda dapat menambahkan jalur awalan ke variabel lingkungan PKG_CONFIG_PATH
Anda.
File build dan file proyek terkait Windows terletak di folder win
, pastikan Anda berada di dalam folder cglm/win
. Analisis Kode diaktifkan, jadi mungkin perlu beberapa saat untuk membuatnya.
$ cd win
$ . build.bat
jika msbuild
tidak berfungsi (karena multi versi VS) maka cobalah membangun dengan devenv
:
$ devenv cglm.sln / Build Release
Anda dapat melihat proyek uji dalam file solusi visual studio yang sama. Cukup menjalankan proyek itu untuk menjalankan pengujian.
Pertama, Anda perlu menginstal Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html lalu:
$ cd docs
$ sphinx-build source build
itu akan mengkompilasi dokumen ke dalam folder build, Anda dapat menjalankan index.html di dalam fungsi itu.
Jika Anda ingin menggunakan fungsi versi sebaris, sertakan header utama
#include
header akan mencakup semua header. Kemudian panggil fungsi yang Anda inginkan misalnya memutar vektor berdasarkan sumbu:
glm_vec3_rotate ( v1 , glm_rad ( 45 ), ( vec3 ){ 1.0f , 0.0f , 0.0f });
beberapa fungsi kelebihan beban :) misalnya Anda dapat menormalkan vektor:
glm_vec3_normalize ( vec );
ini akan menormalkan vec dan menyimpan vektor yang dinormalisasi ke dalam vec
tetapi jika Anda akan menyimpan vektor yang dinormalisasi ke vektor lain, lakukan ini:
glm_vec3_normalize_to ( vec , result );
seperti fungsi ini Anda mungkin melihat _to
postfix, fungsi ini menyimpan hasil ke variabel lain dan menyimpan memori sementara
untuk memanggil versi yang telah dikompilasi termasuk header dengan c
postfix, c berarti panggilan. Versi yang telah dikompilasi sebelumnya hanyalah pembungkus.
#include
header ini akan menyertakan semua header dengan postfix c. Anda perlu memanggil fungsi dengan c posfix:
glmc_vec3_normalize ( vec );
Penggunaan fungsi dan parameter didokumentasikan di dalam header terkait. Anda mungkin melihat parameter yang sama diteruskan dua kali dalam beberapa contoh seperti ini:
glm_mat4_mul ( m1 , m2 , m1 );
/* or */
glm_mat4_mul ( m1 , m1 , m1 );
dua parameter pertama adalah parameter [masuk] dan yang terakhir adalah parameter [keluar] . Setelah mengalikan m1 dan m2 , hasilnya disimpan dalam m1 . Inilah sebabnya kami mengirim m1 dua kali. Anda dapat menyimpan hasilnya dalam matriks yang berbeda, ini hanyalah sebuah contoh.
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 adalah array dari vec4 dan vec4 adalah array dari float. Fungsi glUniformMatrix4fv
menerima float*
sebagai value
(param terakhir), sehingga Anda dapat memasukkan mat4 ke float* atau Anda dapat meneruskan kolom pertama matriks sebagai awal memori matriks:
Opsi 1: Kirim kolom pertama
glUniformMatrix4fv ( location , 1 , GL_FALSE , matrix [ 0 ]);
/* array of matrices */
glUniformMatrix4fv ( location , 1 , GL_FALSE , matrix [ 0 ][ 0 ]);
Opsi 2: Melemparkan matriks ke tipe penunjuk (juga berlaku untuk array beberapa dimensi)
glUniformMatrix4fv ( location , 1 , GL_FALSE , ( float * ) matrix );
Anda dapat meneruskan matriks dengan cara yang sama ke API lain misalnya Vulkan, DX...
YANG HARUS DILAKUKAN:
glm_umat4_mul
) Proyek ini ada berkat semua orang yang berkontribusi. [Menyumbang].
Terima kasih kepada semua pendukung kami! [Menjadi pendukung]
Dukung proyek ini dengan menjadi sponsor. Logo Anda akan muncul di sini dengan tautan ke situs web Anda. [Menjadi sponsor]
MIT. periksa file LISENSI