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 游戏开发

Download history 52571/week @ 2024-05-04 52463/week @ 2024-05-11 49899/week @ 2024-05-18 55227/week @ 2024-05-25 56877/week @ 2024-06-01 54465/week @ 2024-06-08 56006/week @ 2024-06-15 51199/week @ 2024-06-22 49349/week @ 2024-06-29 60367/week @ 2024-07-06 71413/week @ 2024-07-13 69525/week @ 2024-07-20 70619/week @ 2024-07-27 63744/week @ 2024-08-03 82259/week @ 2024-08-10 55075/week @ 2024-08-17

每月282,178次下载
2,074个 包中使用 (直接使用462个)

MIT/Apache

3.5MB
103K SLoC

glam

Build Status Coverage Status Latest Version docs Minimum Supported Rust Version

一个简单快速的游戏和图形3D数学库。

开发状态

glam 处于beta阶段。基本功能已实现,API的外观和感觉已确定。

功能

  • f32 类型
    • 向量:Vec2Vec3Vec3AVec4
    • 方阵:Mat2Mat3Mat3AMat4
    • 四元数类型:Quat
    • 仿射变换类型:Affine2Affine3A
  • f64 类型
    • 向量:DVec2DVec3DVec4
    • 方阵:DMat2DMat3DMat4
    • 四元数类型:DQuat
    • 仿射变换类型:DAffine2DAffine3
  • i16 类型
    • 向量:I16Vec2I16Vec3I16Vec4
  • u16 类型
    • 向量:U16Vec2U16Vec3U16Vec4
  • i32 类型
    • 向量:IVec2IVec3IVec4
  • u32 类型
    • 向量:UVec2UVec3UVec4
  • i64 类型
    • 向量:I64Vec2I64Vec3I64Vec4
  • u64 类型
    • 向量:U64Vec2U64Vec3U64Vec4
  • bool 类型
    • 向量:BVec2BVec3BVec4

单指令多数据(SIMD)

Vec3AVec4QuatMat2Mat3AMat4Affine2Affine3A类型在x86x86_64wasm32架构上使用128位宽的单指令多数据向量类型进行存储。因此,这些类型都是16字节对齐的,并且根据类型或类型成员的大小,它们可能包含内部填充。这导致在Vec3AMat3AAffine2Affine3A的情况下出现一些浪费的空间。然而,SIMD的使用通常比标量数学性能更好。

glammathbench项目测试的常见操作中,性能优于类似的Rust库。

启用SIMD

SIMD在x86x86_64wasm32目标上受支持。

  • SSE2x86_64目标上默认启用。
  • 要在x86目标上启用SSE2,请向RUSTCFLAGS添加-C target-feature=+sse2
  • NEONaarch64目标上默认启用。
  • 要在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"] }

要在项目中同时支持stdno_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 类型 SerializeDeserialize 的实现。注意,序列化应能在带有和没有启用 SIMD 的 glam 构建之间工作
  • rkyv - 所有 glam 类型的 ArchiveSerializeDeserialize 实现。注意,序列化与启用和未启用 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 中没有泛型和最小特质
  • 所有依赖项都是可选的(例如 mintrandserde
  • 尽可能遵循 Rust API 指南
  • 旨在达到 100% 的测试 覆盖率
  • 使用 Criterion.rs 对常用功能进行基准测试

架构

有关 glam 内部结构的详细信息,请参阅 ARCHITECTURE.md

灵感

glam 的界面和内部结构受到了 Rust 和 C++ 世界的许多启发。特别是

许可证

许可方式为以下之一

任选其一。

贡献

对本项目的任何形式贡献(问题、拉取请求等)都必须遵守 Rust 的 行为准则

除非你明确说明,否则根据 Apache-2.0 许可证定义的,你有意提交的任何贡献,都应按照上述方式双许可,不附加任何额外的条款或条件。

如果你有兴趣贡献或有请求或建议,请在 GitHub 上 发起讨论。有关贡献者的更多信息,请参阅 CONTRIBUTING.md

glam 中的大部分代码都是生成的,有关详细信息,请参阅 codegen README

感谢所有 glam 贡献者

支持

Rust 游戏开发 DiscordBevy 引擎 Discord 服务器不是官方支持渠道,但可以是在 glam 中寻求帮助的好地方。

归属

glam 包含从以下 C++ 库移植的代码

  • DirectXMath - MIT 许可证 - 版权 (c) 2011-2020 微软公司
  • 实时数学 - MIT 许可证 - 版权 (c) 2018 Nicholas Frechette
  • GLM - MIT 许可证 - 版权 (c) 2005 - G-Truc Creation

有关详细信息,请参阅 ATTRIBUTION.md

依赖关系