🎥 适用于 C 的 OpenGL 数学库 (glm)


Build Status Documentation Status Codacy Badge Coverage Status Coverage Status

Sponsors on Open Collective Backers on Open Collective


一个高度优化的 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);

结构体 API

包含 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 函数的所有 vec4mat4mat2 参数都已对齐,以防止意外崩溃,或者在存在未对齐版本的情况下使用它们。

结构体 API

结构体 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 版本尝试最佳猜测。

📌 迁移注意事项

🚀 功能特性


与其他图形库(尤其是 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);

贡献者

这个项目的存在归功于所有贡献者。[贡献]

赞助者

感谢我们所有的赞助者!🙏 [成为赞助者]

赞助商

通过成为赞助商来支持这个项目。您的徽标将在此处显示,并链接到您的网站。[成为赞助商]