65个版本 (25个重大更新)
| 新版本 0.29.0 | 2024年8月20日 |
|---|---|
| 0.28.0 | 2024年6月10日 |
| 0.27.0 | 2024年3月23日 |
| 0.25.0 | 2023年12月19日 |
| 0.7.1 | 2019年7月8日 |
#1 in 游戏开发
每月282,178次下载
在 2,074个 包中使用 (直接使用462个)
3.5MB
103K SLoC
glam
一个简单快速的游戏和图形3D数学库。
开发状态
glam 处于beta阶段。基本功能已实现,API的外观和感觉已确定。
功能
f32类型- 向量:
Vec2、Vec3、Vec3A和Vec4 - 方阵:
Mat2、Mat3、Mat3A和Mat4 - 四元数类型:
Quat - 仿射变换类型:
Affine2和Affine3A
- 向量:
f64类型- 向量:
DVec2、DVec3和DVec4 - 方阵:
DMat2、DMat3和DMat4 - 四元数类型:
DQuat - 仿射变换类型:
DAffine2和DAffine3
- 向量:
i16类型- 向量:
I16Vec2、I16Vec3和I16Vec4
- 向量:
u16类型- 向量:
U16Vec2、U16Vec3和U16Vec4
- 向量:
i32类型- 向量:
IVec2、IVec3和IVec4
- 向量:
u32类型- 向量:
UVec2、UVec3和UVec4
- 向量:
i64类型- 向量:
I64Vec2、I64Vec3和I64Vec4
- 向量:
u64类型- 向量:
U64Vec2、U64Vec3和U64Vec4
- 向量:
bool类型- 向量:
BVec2、BVec3和BVec4
- 向量:
单指令多数据(SIMD)
Vec3A、Vec4、Quat、Mat2、Mat3A、Mat4、Affine2和Affine3A类型在x86、x86_64和wasm32架构上使用128位宽的单指令多数据向量类型进行存储。因此,这些类型都是16字节对齐的,并且根据类型或类型成员的大小,它们可能包含内部填充。这导致在Vec3A、Mat3A、Affine2和Affine3A的情况下出现一些浪费的空间。然而,SIMD的使用通常比标量数学性能更好。
glam在mathbench项目测试的常见操作中,性能优于类似的Rust库。
启用SIMD
SIMD在x86、x86_64和wasm32目标上受支持。
SSE2在x86_64目标上默认启用。- 要在
x86目标上启用SSE2,请向RUSTCFLAGS添加-C target-feature=+sse2。 NEON在aarch64目标上默认启用。- 要在
aarch64目标上启用NEON,请向RUSTFLAGS添加-C target-feature=+neon。 - 要在
wasm32目标上启用simd128,请向RUSTFLAGS添加-C target-feature=+simd128。 - 可以通过启用
core-simd功能来启用实验性的可移植SIMD支持。这需要夜间编译器,因为它在Rust中仍然不稳定。
请注意,wasm32上的SIMD通过了测试,但尚未进行基准测试,性能可能或可能不如标量数学。
no_std支持
可以通过使用--no-default-features编译来启用no_std支持,以禁用std支持,并使用--features libm为仅定义在std中的数学函数。例如:
[dependencies]
glam = { version = "0.29.0", default-features = false, features = ["libm"] }
要在项目中同时支持std和no_std构建,您可以在您的Cargo.toml中使用以下内容:
[features]
default = ["std"]
std = ["glam/std"]
libm = ["glam/libm"]
[dependencies]
glam = { version = "0.29.0", default-features = false }
可选功能
approx- 近似浮点比较的特性和宏bytemuck- 用于转换为字节数组切片libm- 使用libm数学函数而不是std,需要使用no_std编译mint- 用于与其他3D数学库交互rand- 为所有glam类型实现Distribution特质的实现serde- 所有glam类型Serialize和Deserialize的实现。注意,序列化应能在带有和没有启用 SIMD 的glam构建之间工作rkyv- 所有glam类型的Archive、Serialize和Deserialize实现。注意,序列化与启用和未启用scalar-math功能的版本不兼容。它应能在所有其他glam构建之间工作。目前不支持字节序转换bytecheck- 在使用rkyv功能时执行存档验证
功能门
scalar-math- 禁用 SIMD 支持进行编译debug-glam-assert- 在调试构建中添加断言,检查传递给glam的参数的有效性,以帮助捕获运行时错误glam-assert- 向所有构建添加验证断言cuda- 强制glam类型与预期的 cuda 对齐 匹配fast-math- 默认情况下,glam 尝试在所有平台上提供位对位的相同结果。使用此功能将启用特定于平台的最优化,这些最优化可能与其他平台不匹配。中间库不应使用此功能,并将决定推迟到最终二进制构建。core-simd- 通过 可移植 SIMD 模块启用 SIMD 支持。这是一个不稳定的功能,需要 nightly Rust 工具链和std支持。
最小支持的 Rust 版本 (MSRV)
glam 的最小支持的 Rust 版本是 1.68.2。
约定
列向量
glam 将向量解释为列矩阵(也称为“列向量”),这意味着在用矩阵变换向量时,矩阵位于左侧,例如 v' = Mv。DirectX 使用行向量,OpenGL 使用列向量。两者都有优缺点。
列主序
矩阵以列主序格式存储。每个列向量存储在连续的内存中。
坐标系
glam 是坐标系无关的,旨在支持右手和左手约定。
设计理念
此库的设计受对简单性和良好性能的追求所指导。
- 为了使用简单,公共 API 中没有泛型和最小特质
- 所有依赖项都是可选的(例如
mint、rand和serde) - 尽可能遵循 Rust API 指南
- 旨在达到 100% 的测试 覆盖率
- 使用 Criterion.rs 对常用功能进行基准测试
架构
有关 glam 内部结构的详细信息,请参阅 ARCHITECTURE.md
灵感
glam 的界面和内部结构受到了 Rust 和 C++ 世界的许多启发。特别是
- 如何在 2016 年编写数学库 启发了初始的
Vec3A实现 - 实时数学 - 仅头文件的 C++11,支持 SSE 和 NEON SIMD 内置函数
- DirectXMath - 仅头文件的 SIMD C++ 线性代数库,用于游戏和图形应用程序
glam是对流行的 C++ 库 GLM 命名的游戏
许可证
许可方式为以下之一
- Apache 许可证 2.0(《LICENSE-APACHE》或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(《LICENSE-MIT》或 https://open-source.org.cn/licenses/MIT)
任选其一。
贡献
对本项目的任何形式贡献(问题、拉取请求等)都必须遵守 Rust 的 行为准则。
除非你明确说明,否则根据 Apache-2.0 许可证定义的,你有意提交的任何贡献,都应按照上述方式双许可,不附加任何额外的条款或条件。
如果你有兴趣贡献或有请求或建议,请在 GitHub 上 发起讨论。有关贡献者的更多信息,请参阅 CONTRIBUTING.md。
glam 中的大部分代码都是生成的,有关详细信息,请参阅 codegen README。
感谢所有 glam 贡献者!
支持
Rust 游戏开发 Discord 和 Bevy 引擎 Discord 服务器不是官方支持渠道,但可以是在 glam 中寻求帮助的好地方。
归属
glam 包含从以下 C++ 库移植的代码
- DirectXMath - MIT 许可证 - 版权 (c) 2011-2020 微软公司
- 实时数学 - MIT 许可证 - 版权 (c) 2018 Nicholas Frechette
- GLM - MIT 许可证 - 版权 (c) 2005 - G-Truc Creation
有关详细信息,请参阅 ATTRIBUTION.md。