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》或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/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。