C
Biblioteca matemática 2D|3D altamente optimizada, también conocida como OpenGL Mathematics (glm) para `C` . cglm proporciona muchas utilidades para ayudar a que las operaciones matemáticas sean rápidas y rápidas de escribir. Es amigable con la comunidad, no dude en informar cualquier problema o error que haya enfrentado.
Casi todas las funciones (versiones en línea) y parámetros están documentados dentro de los encabezados correspondientes.
Documentación completa: http://cglm.readthedocs.io
glm_vec_dup -> glm_vec3_copy
CGLM_FORCE_DEPTH_ZERO_TO_ONE
y CGLM_FORCE_LEFT_HANDED
se proporcionan para controlar el clipspace. Debería poder usar cglm con Vulkan, DirectX y Metal ahora... consulte https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s Si aún no conoce la biblioteca GLM original, también puede consultar: https://github.com/g-truc/glm
vec4
y mat4
deben estar alineadas. (Habrá versiones no alineadas más adelante) cglm
no asigna memoria en el montón. Por lo que no proporciona ningún asignador. También debe asignar memoria para los parámetros externos si pasa el puntero de la ubicación de la memoria. No olvide que vec4 (también quat/ versor ) y mat4 deben estar alineados (16 bytes), porque cglm usa instrucciones SIMD para optimizar la mayoría de las operaciones, si están disponibles.
cglm admite tanto ARRAY API como STRUCT API , por lo que puede devolver estructuras si utiliza struct api ( glms_
).
Al igual que otras bibliotecas de gráficos (especialmente OpenGL), esta biblioteca utiliza un diseño de columna principal para mantener las matrices en la memoria. En el futuro, la biblioteca puede admitir una opción para usar el diseño de fila principal; ACTUALMENTE, si necesita un diseño de fila principal, deberá transponerlo. |
Tiene dos opciones para llamar a una función/operación: en línea o llamada a biblioteca (enlace). Casi todas las funciones están marcadas en línea (always_inline), por lo que el compilador probablemente lo hará en línea. Para llamar a versiones precompiladas, simplemente use glmc_
(c significa 'llamar') en lugar de 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 */
La mayoría de las funciones matemáticas se optimizan manualmente con SSE2 si está disponible, ¿si no? No se preocupe, existen versiones no SSE de todas las operaciones.
Puede pasar matrices y vectores como matriz a funciones en lugar de obtener la dirección.
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 });
La biblioteca contiene funciones mat4 mul e inversas de uso general, y también contiene algunas formas especiales (optimizadas) de estas funciones para matrices de transformaciones afines. Si desea multiplicar dos matrices de transformación afines, puede usar glm_mul en lugar de glm_mat4_mul y glm_inv_tr (ROT + TR) en lugar de glm_mat4_inv.
/* multiplication */
mat4 modelMat ;
glm_mul ( T , R , modelMat );
/* othonormal rot + tr matrix inverse (rigid-body) */
glm_inv_tr ( modelMat );
La API de estructura funciona de la siguiente manera: tenga en cuenta el sufijo s
en los tipos, el prefijo glms_
en funciones y el prefijo GLMS_
en constantes:
#include
mat4s mat = GLMS_MAT4_IDENTITY_INIT ;
mat4s inv = glms_mat4_inv ( mat );
Las funciones de estructura generalmente toman sus parámetros como valores y devuelven sus resultados, en lugar de tomar punteros y escribir parámetros. Eso significa que tus parámetros generalmente pueden ser const
, si te gusta eso.
Los tipos utilizados son en realidad uniones que permiten acceder a los mismos datos de múltiples formas. Una de esas formas implica estructuras anónimas, disponibles desde C11. MSVC también lo admite para versiones anteriores de C listas para usar y GCC/Clang lo hace si habilita -fms-extensions
. Para habilitar explícitamente estas estructuras anónimas, #define CGLM_USE_ANONYMOUS_STRUCT
en 1
, para deshabilitarlas, en 0
. Para compatibilidad con versiones anteriores, también puede #define CGLM_NO_ANONYMOUS_STRUCT
(el valor es irrelevante) para deshabilitarlos. Si no lo especifica explícitamente, cglm hará una mejor estimación según su compilador y la versión C que esté utilizando.
$ 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
Esto no requiere construcción ni instalación de 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
Dado que se utilizan funciones matemáticas como sinf
, esto no puede apuntar a wasm32-unknown-unknown
, se debe usar uno de wasi-sdk o emscripten.
Debe tener en cuenta que la compilación compartida aún no es compatible con WebAssembly.
Para compatibilidad con simd128, agregue -msimd128
a CMAKE_C_FLAGS
, en la línea de comando -DCMAKE_C_FLAGS="-msimd128"
.
Para las pruebas, la opción cmake CGLM_USE_TEST
aún funcionaría; necesitará un tiempo de ejecución wasi para ejecutar las pruebas; consulte nuestro archivo de configuración ci para ver un ejemplo detallado.
$ cmake ..
-DCMAKE_TOOLCHAIN_FILE=/path/to/wasi-sdk-19.0/share/cmake/wasi-sdk.cmake
-DWASI_SDK_PREFIX=/path/to/wasi-sdk-19.0
Donde /path/to/wasi-sdk-19.0/
es la ruta al SDK de wasi extraído.
En este caso, por defecto realizaría una compilación estática.
$ emcmake cmake ..
-DCMAKE_EXE_LINKER_FLAGS= " -s STANDALONE_WASM "
-DCGLM_STATIC=ON
El emcmake
aquí es el contenedor cmake para Emscripten desde el emsdk instalado.
$ 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)
Actualmente, solo se admiten las opciones de compilación predeterminadas. Agregue la dependencia cglm a su proyecto:
...
Package (
...
dependencies : [
...
. package ( url : " https://github.com/recp/cglm " , . branch ( " master " ) ) ,
]
...
)
Ahora agregue cgml como una dependencia de su objetivo. Las opciones de productos son:
...
. target (
...
dependencies : [
...
. product ( name : " cglm " , package : " cglm " ) ,
]
...
)
...
$ sh autogen.sh
$ ./configure
$ make
$ make check # [Optional]
$ [sudo] make install # [Optional]
Esto también instalará los archivos pkg-config para que pueda usar pkg-config --cflags cglm
y pkg-config --libs cglm
para recuperar los indicadores del compilador y del enlazador.
Los archivos se instalarán en el prefijo dado (generalmente /usr/local
de forma predeterminada en Linux), pero es posible que su pkg-config no esté configurado para verificar allí. Puede averiguar dónde está mirando ejecutando pkg-config --variable pc_path pkg-config
y cambiando la ruta en la que están instalados los archivos a través de ./configure --with-pkgconfigdir=/your/path
. Alternativamente, puede agregar la ruta del prefijo a su variable de entorno PKG_CONFIG_PATH
.
Los archivos de compilación y de proyecto relacionados con Windows se encuentran en la carpeta win
, asegúrese de estar dentro de la carpeta cglm/win
. El análisis de código está habilitado, por lo que la compilación puede tardar un poco.
$ cd win
$ . build.bat
Si msbuild
no funciona (debido a la versión múltiple de VS), intente compilar con devenv
:
$ devenv cglm.sln / Build Release
Puede ver el proyecto de prueba en el mismo archivo de solución de Visual Studio. Basta con ejecutar ese proyecto para ejecutar pruebas.
Primero necesitas instalar Sphinx: http://www.sphinx-doc.org/en/master/usage/installation.html y luego:
$ cd docs
$ sphinx-build source build
compilará documentos en la carpeta de compilación, puede ejecutar index.html dentro de esa función.
Si desea utilizar las versiones en línea de funciones, incluya el encabezado principal
#include
el encabezado incluirá todos los encabezados. Luego llame a la función que desee, por ejemplo, rotar vector por eje:
glm_vec3_rotate ( v1 , glm_rad ( 45 ), ( vec3 ){ 1.0f , 0.0f , 0.0f });
algunas funciones están sobrecargadas :) por ejemplo, puedes normalizar el vector:
glm_vec3_normalize ( vec );
esto normalizará vec y almacenará el vector normalizado en vec
pero si almacenará el vector normalizado en otro vector, haga esto:
glm_vec3_normalize_to ( vec , result );
Al igual que esta función, es posible que vea _to
postfix, esta función almacena los resultados en otras variables y ahorra memoria temporal.
para llamar a versiones precompiladas, incluya el encabezado con el sufijo c
, c significa llamar. Las versiones precompiladas son sólo envoltorios.
#include
este encabezado incluirá todos los encabezados con sufijo c. Necesitas llamar funciones con c posfix:
glmc_vec3_normalize ( vec );
El uso de funciones y los parámetros están documentados dentro de encabezados relacionados. Es posible que veas el mismo parámetro pasado dos veces en algunos ejemplos como este:
glm_mat4_mul ( m1 , m2 , m1 );
/* or */
glm_mat4_mul ( m1 , m1 , m1 );
los dos primeros parámetros son [in] y el último es el parámetro [out] . Después de multiplicar m1 y m2 , el resultado se almacena en m1 . Por eso enviamos m1 dos veces. Puedes almacenar el resultado en una matriz diferente, esto es sólo un ejemplo.
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 es una matriz de vec4 y vec4 es una matriz de flotadores. Las funciones glUniformMatrix4fv
aceptan float*
como value
(último parámetro), por lo que puede convertir mat4 a float* o puede pasar la primera columna de la matriz como comienzo de la memoria de la matriz:
Opción 1: enviar la primera columna
glUniformMatrix4fv ( location , 1 , GL_FALSE , matrix [ 0 ]);
/* array of matrices */
glUniformMatrix4fv ( location , 1 , GL_FALSE , matrix [ 0 ][ 0 ]);
Opción 2: convertir matriz a tipo de puntero (también válido para matrices multidimensionales)
glUniformMatrix4fv ( location , 1 , GL_FALSE , ( float * ) matrix );
Puede pasar matrices de la misma manera a otras API, por ejemplo, Vulkan, DX...
HACER:
glm_umat4_mul
) Este proyecto existe gracias a todas las personas que contribuyen. [Contribuir].
¡Gracias a todos nuestros patrocinadores! [Conviértete en patrocinador]
Apoya este proyecto convirtiéndote en patrocinador. Su logotipo aparecerá aquí con un enlace a su sitio web. [Conviértete en patrocinador]
MIT. verifique el archivo de LICENCIA