2 个不稳定版本
使用旧的Rust 2015
0.2.0 | 2018年1月7日 |
---|---|
0.1.0 | 2017年10月26日 |
#1536 in 游戏开发
150KB
3K SLoC
Physics library for use in Specs, using cgmath and collision-rs.
示例
extern crate cgmath;
extern crate rhusics;
extern crate shrev;
extern crate specs;
use cgmath::{Point2, Rad, Rotation2, Transform};
use shrev::EventChannel;
use specs::{RunNow, World};
use rhusics::ecs::collide::prelude2d::{register_collision, BasicCollisionSystem2, BodyPose2,
BroadBruteForce2, CollisionMode, CollisionShape2,
CollisionStrategy, ContactEvent2, GJK2, Rectangle};
pub fn main() {
let mut world = World::new();
register_collision::<f32, BodyPose2<f32>, ()>(&mut world);
let mut reader_1 = world
.write_resource::<EventChannel<ContactEvent2<f32>>>()
.register_reader();
world
.create_entity()
.with(CollisionShape2::<f32, BodyPose2<f32>, ()>::new_simple(
CollisionStrategy::FullResolution,
CollisionMode::Discrete,
Rectangle::new(10., 10.).into(),
))
.with(BodyPose2::<f32>::one());
world
.create_entity()
.with(CollisionShape2::<f32, BodyPose2<f32>, ()>::new_simple(
CollisionStrategy::FullResolution,
CollisionMode::Discrete,
Rectangle::new(10., 10.).into(),
))
.with(BodyPose2::new(
Point2::new(3., 2.),
Rotation2::from_angle(Rad(0.)),
));
let mut system = BasicCollisionSystem2::<f32, BodyPose2<f32>, ()>::new()
.with_broad_phase(BroadBruteForce2::default())
.with_narrow_phase(GJK2::new());
system.run_now(&world.res);
println!(
"Contacts: {:?}",
world
.read_resource::<EventChannel<ContactEvent2<f32>>>()
.read(&mut reader_1)
.collect::<Vec<_>>()
);
}
特性
- 支持 collision-rs 中的所有原始形状
- 支持 collision-rs 中的以下广度搜索算法
- 暴力法
- 扫描和修剪
- 使用 GJK 进行窄度碰撞检测,可选 EPA 以获取完整的接触信息
specs::System
用于用户提供的变换和形状组件的碰撞检测。可选使用广度和/或窄度检测。库提供了一个变换实现以方便使用。specs::System
用于用户提供的变换和形状组件的空间排序。- 支持使用 collision-rs DBVT 进行空间排序/碰撞检测。
- 支持使用 collision-rs DBVT 进行广度搜索。
- 使用 GJK 进行连续碰撞检测
- 具有单次接触前向解决的简单刚体实现
TODO
- 冲量求解器
- 积分器实现(欧拉,RK4 等)
- 并行求解器实现
依赖项
~1.2–2.4MB
~44K SLoC