一个高度优化的 2D|3D 数学库。也被称为适用于 C 的 OpenGL 数学库 (glm)。cglm 提供了快速且符合人体工程学的数学函数,以简化图形编程。它对社区友好 – 欢迎报告您遇到的任何错误和问题。
如果您正在使用 C++,您可能需要查看 GLM
所有函数及其参数都记录在它们各自头文件中的声明上方。
或者,您可以在此处阅读完整的文档。
cglm 可以完全作为仅头文件库使用,只需包含 cglm/cglm.h
即可。如果您希望链接它,可以使用受支持的构建系统之一来构建它。有关在各个平台上构建的详细信息和构建系统以及构建文档的说明,请参见 BUILDING.md。
包含 cglm/cglm.h
头文件,并使用带有 glm_
前缀的函数。
#include "cglm/cglm.h"
// ...
vec2 vector;
glm_vec2_zero(vector);
包含 cglm/struct.h
并使用 glms_
。
#include "cglm/struct.h"
// ...
vec2s vector = glms_vec2_zero();
包含 cglm/call.h
并使用 glmc_
。
#include "cglm/call.h"
// ...
vec2 vector;
glmc_vec2_zero(vector);
虽然 cglm 默认情况下会对其必要的内容进行对齐,但可以通过定义 CGLM_ALL_UNALIGNED
来禁用此功能。如果您面向任何具有 SIMD 支持的机器,请确保传递给 cglm 函数的所有 vec4
、mat4
和 mat2
参数都已对齐,以防止意外崩溃,或者在存在未对齐版本的情况下使用它们。
结构体 API 的工作方式如下(请注意类型上的 s
后缀,函数上的 glms_
前缀和常量上的 GLMS_
)
#include <cglm/struct.h>
mat4s mat = GLMS_MAT4_IDENTITY_INIT;
mat4s inv = glms_mat4_inv(mat);
结构体函数通常按值复制参数并返回结果,而不是接受指针并写入输出参数。这意味着如果喜欢,您的变量通常可以是 const
。
使用的类型实际上是联合体,允许以多种方式访问相同的数据。其中一种涉及自 C11 起可用的匿名结构。MSVC 在早期版本中开箱即用地支持它们,GCC/Clang 如果您启用 -fms-extensions
也支持。要显式启用匿名结构,请 #define CGLM_USE_ANONYMOUS_STRUCT 1
,或 0
禁用它们。为了向后兼容,您也可以 #define CGLM_NO_ANONYMOUS_STRUCT
来禁用它们。如果您未明确指定,cglm 将根据您的编译器和 C 版本尝试最佳猜测。
_dup
(复制)函数已重命名为 _copy
。例如:glm_vec_dup
-> glm_vec3_copy
。glm_simd_
函数已重命名为 glmm_
。vec3
和 mat3
类型默认情况下未对齐。CGLM_FORCE_DEPTH_ZERO_TO_ONE
和 CGLM_FORCE_LEFT_HANDED
标志来控制裁剪深度和惯用性。这使得将 cglm 纳入使用 Vulkan 或 Metal 等图形 API 的项目变得更加容易。请参阅 https://cglm.readthedocs.io/en/latest/opt.html#clipspace-option-s
与其他图形库(尤其是 OpenGL)一样,cglm 使用列优先布局将矩阵保存在内存中。
虽然我们将来可能会支持行优先矩阵,但目前如果您需要矩阵采用行优先布局,则必须转置它们。 |
|
cglm 包含通用的 mat4 乘积和逆函数,但也为仿射变换提供了优化版本。如果要乘以两个仿射变换矩阵,可以使用 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);
这个项目的存在归功于所有贡献者。[贡献]
感谢我们所有的赞助者!🙏 [成为赞助者]
通过成为赞助商来支持这个项目。您的徽标将在此处显示,并链接到您的网站。[成为赞助商]