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 数学
275KB
5K SLoC
beagle-rs
计算机图形学的基本线性代数库。 🐶
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将其转换为仅包含X
和Y
分量的子向量,通过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
特质带来了一些限制。只有像XY
或YZW
这样的顺序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 License,版本 2.0(《LICENSE-APACHE》或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT》)
。
贡献
除非你明确声明,否则任何有意提交以包含在作品中的贡献(根据 Apache-2.0 许可证定义),都将如上所述双许可,而无需任何额外条款或条件。