#matrix-vector #linear-algebra #matrix #gamedev #vector-math #vector

nightly beagle

计算机图形学的基本线性代数库

5个版本

使用旧的Rust 2015

0.1.4 2016年11月7日
0.1.3 2016年11月2日
0.1.2 2016年11月1日
0.1.1 2015年12月18日
0.1.0 2015年12月15日

#1429 in 数学

MIT/Apache

275KB
5K SLoC

beagle-rs

Build Status Version License Downloads

文档

计算机图形学的基本线性代数库。 🐶

Beagle主要受GLSL(但Beagle是行主序)的启发,并试图在Rust中重现其大多数功能。

常见问题解答

为什么我应该使用beagle?

Beagle提供通用的矩阵和向量类型,大小高达4x4。它提供了所有预期的操作符,包括向量/矩阵与标量之间的操作(尽管标量必须用v函数包装)。

Beagle还提供在矩阵和向量上通用的操作(例如逐元素比较、逐元素平方根、分量求和)。

Beagle使您能够轻松设计自己的自定义逐元素函数。

Beagle还通过Index运算符提供swizzles。

Swizzles是什么?

Swizzles是重新排列向量元素的不错方式。例如,给定向量a

use beagle::vec::*;
use beagle::index::swizzle:xyzw::*;

let a = Vec4::new([3, 5, 7, 11]);

我们可以使用swizzle将其转换为仅包含XY分量的子向量,通过a[XY]。我们甚至可以通过这种方式修改a

a[XY] += Vec2::new(1, 3);
assert_eq!(a, Vec4::new([4, 8, 7, 11]));

Swizzles甚至可以用来复制分量

let r = a[ZZZZ] + Vec4::new([1, 2, 3, 4]);
assert_eq!(r, Vec4::new([12, 13, 14, 15]));

与glsl一样,包含单个分量多个副本的swizzle无法修改

a[ZZ] += Vec2::new(1, 3); // error

此外,Rust缺乏IndexGet/IndexAssign特质带来了一些限制。只有像XYYZW这样的顺序swizzle会实际生成Vec对象,因此它们可以被直接赋值。其他swizzle目前被降级为返回引用对象。

这意味着您不能将值赋给非顺序swizzle(除非使用unsafe,但请尽量不要这样做)。另外,当将值赋给Vec对象(简单对象或顺序swizzle的结果)时,您不能直接使用非顺序swizzle,因为它们不是直接的Vec对象。

a[YX] = Vec2::new(1, 2); // error: non-sequential LHS
a[XY] = b[YX];           // error: non-sequential RHS
a[XY] = b[YX].into();    // works
a[XY] = &b[YX] + v(0);   // works

注意最后一个例子中的 &。这是非顺序混合的另一个限制。因为它们是引用对象,而且大多数情况下,Index 操作符会自动解引用,我们必须显式地重新添加引用。

与 glsl 类似,你可以自由混合混合的结果。请注意,这可能导致相当于顺序混合的结果,因此结果将是一个 Vec 对象。

a[YX][YX] = Vec2::new(1, 2);

我实在不知道你为什么会这样做,但你确实可以。

同样,在 glsl 中,由于矩阵索引的结果是一个 Vec 对象,你可以自由混合它

m[0][XY] = Vec2::new(1, 2);

这个 crate 需要 nightly,为什么?

遗憾的是,目前确实需要 nightly。所使用的东西有

  • associated_consts
  • advanced_slice_patterns

我愿意暂时放弃 associated_consts 以换取静态函数,但 advanced_slice_patterns 绝对必要,所以是铢积寸累。

看起来你的代码中有许多 unsafe,我应该担心吗?

是的,请在 rust-lang/rust#37302 上表达你的担忧,这样我就可以移除大部分 unsafe 代码。

之后,阻止移除 unsafe 的下一个问题是缺乏为 swizzles 提供的 IndexGet/IndexAssign。对于某些情况,使用 unsafe 有点绕过这个问题,但直到 rust-lang/rfcs#997 有所进展,这仍然是一种权宜之计。

然而,有一些 unsafe 事情是不会消失的。

  • FloatTransmute 的实现。
  • [T; 4]CustomArrayFour<T>Vec4<T> 之间来回转换引用。

接下来是什么?

  • 更多的测试。
  • 更多的文档。

许可

根据你的选择,许可方式为

贡献

除非你明确声明,否则任何有意提交以包含在作品中的贡献(根据 Apache-2.0 许可证定义),都将如上所述双许可,而无需任何额外条款或条件。

无运行时依赖