#shape #convex #collision #axis #theorem #2d #finding

sepax2d

一个安全的crate,用于使用分离轴定理在二维中查找和解决凸形状的碰撞。

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算法

Download history 123/week @ 2024-03-11 107/week @ 2024-03-18 134/week @ 2024-03-25 281/week @ 2024-04-01 43/week @ 2024-04-08 72/week @ 2024-04-15 66/week @ 2024-04-22 63/week @ 2024-04-29 105/week @ 2024-05-06 92/week @ 2024-05-13 107/week @ 2024-05-20 91/week @ 2024-05-27 69/week @ 2024-06-03 82/week @ 2024-06-10 58/week @ 2024-06-17 115/week @ 2024-06-24

331 每月下载量
用于 bevy_sepax2d

MIT/Apache

70KB
1.5K SLoC

Crates.io MIT/Apache 2.0

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)));

PolygonCircleCapsuleParallelogram形状实现了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_lineintersects_rayintersects_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)));

注意事项

分离轴定理仅适用于凸形状。如果传入的是凹形状,可能会错过重叠,并检测到假的重叠。

凸性对于CircleAABBParallelogramCapsule来说不是问题,因为这些形状根据定义是凸的。对于多边形,可以定义一个凹形状。可以使用polygon.is_convex()方法来测试多边形的凸性。或者,构造函数Polygon::convex_from_vertices(position, vertices)返回一个Option(Polygon),如果你尝试创建一个凹多边形,则返回None

特性

为支持形状的序列化和反序列化启用serde特性!

示例

存储库包括两个使用ggez构建的示例应用程序,展示了重叠和碰撞功能。它们可以通过以下方式从存储库中运行:

cargo run --example overlap

cargo run --example collision

贡献

请随时提出更多功能、错误修复或优化的建议。谢谢!

依赖项

~170KB