11个版本
0.3.8 | 2022年8月30日 |
---|---|
0.3.7 | 2022年7月1日 |
0.3.5 | 2022年6月30日 |
0.2.0 | 2022年6月3日 |
0.1.0 | 2022年5月30日 |
#471 在 算法 中
331 每月下载量
用于 bevy_sepax2d
70KB
1.5K SLoC
sepax2d
sepax2d是一个安全的Rust crate,用于在二维中使用分离轴定理(SAT)查找和解决凸形状的碰撞。
使用方法
将以下内容添加到你的Cargo.toml
的[dependencies]
部分
sepax2d = "0.3"
导入你想要使用的形状类型,并创建一些新的形状
use sepax2d::prelude::*;
let rectangle = AABB::new(top_left, width, height);
let circle = Circle::new(center, radius);
let capsule = Capsule::new(center, arm, radius);
//The vertices of a polygon are position vectors
//relative to the shape's position, i.e. if position
//is (1, 2), then the absolute location of the
//first vertex is (1, 0).
let triangle = Polygon::from_vertices
(
position,
vec![(0.0, -2.0), (-1.0, 2.0), (1.0, 2.0)]
);
使用sat_overlap(&left, &right)
方法来获取一个指示两个给定形状是否重叠的bool
。任何实现Shape
特质的结构都可以使用。
assert!(sat_overlap(&circle, &capsule));
assert!(sat_overlap(&triangle, &rectangle));
使用sat_collision(&left, &right)
方法来获取一个表示需要添加到right
的位置以解决两个形状重叠的(f32, f32)
。
let resolution = sat_overlap(&circle, &triangle);
let position = triangle.position();
triangle.set_position((position.0 + resolution.0, position.1 + resolution.1));
assert!(!sat_overlap(&circle, &triangle));
使用contains_point(&shape, point)
方法来获取一个指示指定点是否在给定形状内的bool
。
let rectangle = AABB::new((0.0, 0.0), 5.0, 2.0);
assert!(contains_point(&rect, (1.0, 1.0)));
assert!(!contains_point(&rect, (10.0, -1.0)));
Polygon
、Circle
、Capsule
和Parallelogram
形状实现了Rotate
特质,允许你围绕它们的position
旋转它们。
# use sepax2d::prelude::*;
# let position = (-1.0, -1.0);
let mut triangle = Polygon::from_vertices
(
position,
vec![(-1.0, 0.0), (0.0, 2.0), (1.0, 0.0)]
);
triangle.rotate(std::f32::consts::FRAC_PI_2)
//New vertices: [(0.0, -1.0), (-2.0, 0.0), (0.0, 1.0)]
你可以使用intersects_line
、intersects_ray
和intersects_segment
方法来检查形状是否与相应的线类型相交。
# use sepax2d::prelude::*;
let triangle = Polygon::from_vertices((0.0, vec![(0.0, 0.0), (1.0, 1.0), (-1.0, 1.0)]));
assert!(intersects_segment(&triangle, (2.0, 0.5), (-2.0, 0.5)));
注意事项
分离轴定理仅适用于凸形状。如果传入的是凹形状,可能会错过重叠,并检测到假的重叠。
凸性对于Circle
、AABB
、Parallelogram
或Capsule
来说不是问题,因为这些形状根据定义是凸的。对于多边形,可以定义一个凹形状。可以使用polygon.is_convex()
方法来测试多边形的凸性。或者,构造函数Polygon::convex_from_vertices(position, vertices)
返回一个Option(Polygon)
,如果你尝试创建一个凹多边形,则返回None
。
特性
为支持形状的序列化和反序列化启用serde
特性!
示例
存储库包括两个使用ggez构建的示例应用程序,展示了重叠和碰撞功能。它们可以通过以下方式从存储库中运行:
cargo run --example overlap
cargo run --example collision
贡献
请随时提出更多功能、错误修复或优化的建议。谢谢!
依赖项
~170KB