64
CHANGELOG.md
64
CHANGELOG.md
@@ -1,7 +1,71 @@
|
|||||||
## v0.9.0
|
## v0.9.0
|
||||||
|
The user-guide has been fully rewritten and is now exhaustive! Check it out on [rapier.rs](https://rapier.rs/)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- A prelude has been added in order to simplify the most common imports. For example: `use rapier3d::prelude::*`
|
||||||
|
- Add `RigidBody::set_translation` and `RigidBody.translation()`.
|
||||||
|
- Add `RigidBody::set_rotation` and `RigidBody.rotation().
|
||||||
|
- Add `RigidBody::set_next_translation` for setting the next translation of a position-based kinematic body.
|
||||||
|
- Add `RigidBody::set_next_rotation` for setting the next rotation of a position-based kinematic body.
|
||||||
|
- Add kinematic bodies controlled at the velocity level: use `RigidBodyBuilder::new_kinematic_velocity_based` or
|
||||||
|
`RigidBodyType::KinematicVelocityBased`.
|
||||||
|
|
||||||
### Modified
|
### Modified
|
||||||
|
The use of `RigidBodySet, ColliderSet, RigidBody, Collider` is no longer mandatory. Rigid-bodies and colliders have
|
||||||
|
been split into multiple components that can be stored in a user-defined set. This is useful for integrating Rapier
|
||||||
|
with other engines (for example this allows use to use Bevy's Query as our rigid-body/collider sets).
|
||||||
|
|
||||||
|
The `RigidBodySet, ColliderSet, RigidBody, Collider` are still the best option for whoever doesn't want to
|
||||||
|
provide their own component sets.
|
||||||
|
|
||||||
|
#### Rigid-bodies
|
||||||
- Renamed `BodyStatus` to `RigidBodyType`.
|
- Renamed `BodyStatus` to `RigidBodyType`.
|
||||||
|
- `RigidBodyBuilder::translation` now takes a vector instead of individual components.
|
||||||
|
- `RigidBodyBuilder::linvel` now takes a vector instead of individual components.
|
||||||
|
- The `RigidBodyBuilder::new_kinematic` has be replaced by the `RigidBodyBuilder::new_kinematic_position_based` and
|
||||||
|
`RigidBodyBuilder::new_kinematic_velocity_based` constructors.
|
||||||
|
- The `RigidBodyType::Kinematic` variant has been replaced by two variants: `RigidBodyType::KinematicVelocityBased` and
|
||||||
|
`RigidBodyType::KinematicPositionBased`.
|
||||||
|
|
||||||
|
#### Colliders
|
||||||
|
- `Colliderbuilder::translation` now takes a vector instead of individual components.
|
||||||
|
- The way `PhysicsHooks` are enabled changed. Now, a physics hooks is executed if any of the two
|
||||||
|
colliders involved in the contact/intersection pair contains the related `PhysicsHooksFlag`.
|
||||||
|
These flags are configured on each collider with `ColliderBuilder::active_hooks`. As a result,
|
||||||
|
there is no `PhysicsHooks::active_hooks` method any more.
|
||||||
|
- All events are now disabled for all colliders by default. Enable events for specific colliders by setting its
|
||||||
|
`active_events` bit mask to `ActiveEvents::CONTACT_EVENTS` and/or `ActiveEvents::PROXIMITY_EVENTS`.
|
||||||
|
- Add a simpler way of enabling collision-detection between colliders attached to two non-dynamic rigid-bodies: see
|
||||||
|
`ColliderBuilder::active_collision_types`.
|
||||||
|
- The `InteractionGroups` is now a structures with two `u32` integers: one integers for the groups
|
||||||
|
membership and one for the group filter mask. (Before, both were only 16-bits wide, and were
|
||||||
|
packed into a single `u32`).
|
||||||
|
- Before, sensor colliders had a default density set to 0.0 whereas non-sensor colliders had a
|
||||||
|
default density of 1.0. This has been unified by setting the default density to 1.0 for both
|
||||||
|
sensor and non-sensor colliders.
|
||||||
|
- Colliders are no longer required to be attached to a rigid-body. Therefore, `ColliderSet::insert`
|
||||||
|
only takes the collider as argument now. In order to attach the collider to a rigid-body,
|
||||||
|
(i.e., the old behavior of `ColliderSet::insert`), use `ColliderSet::insert_with_parent`.
|
||||||
|
- Fixed a bug where collision groups were ignored by CCD.
|
||||||
|
|
||||||
|
#### Joints
|
||||||
|
- The fields `FixedJoint::local_anchor1` and `FixedJoint::local_anchor2` have been renamed to
|
||||||
|
`FixedJoint::local_frame1` and `FixedJoint::local_frame2`.
|
||||||
|
|
||||||
|
#### Pipelines and others
|
||||||
|
- The field `ContactPair::pair` (which contained two collider handles) has been replaced by two
|
||||||
|
fields: `ContactPair::collider1` and `ContactPair::collider2`.
|
||||||
|
- The list of active dynamic bodies is no retrieved with `IslandManager::active_dynamic_bodies`
|
||||||
|
instead of `RigidBodySet::iter_active_dynamic`.
|
||||||
|
- The list of active kinematic bodies is no retrieved with `IslandManager::active_kinematic_bodies`
|
||||||
|
instead of `RigidBodySet::iter_active_kinematic`.
|
||||||
|
- `NarrowPhase::contacts_with` now returns an `impl Iterator<Item = &ContactPair>` instead of
|
||||||
|
an `Option<impl Iterator<Item = (ColliderHandle, ColliderHandle, &ContactPair)>>`. The colliders
|
||||||
|
handles can be read from the contact-pair itself.
|
||||||
|
- `NarrowPhase::intersections_with` now returns an iterator directly instead of an `Option<impl Iterator>`.
|
||||||
|
- Rename `PhysicsHooksFlags` to `ActiveHooks`.
|
||||||
|
- Add the contact pair as an argument to `EventHandler::handle_contact_event`
|
||||||
|
|
||||||
|
|
||||||
## v0.8.0
|
## v0.8.0
|
||||||
### Modified
|
### Modified
|
||||||
|
|||||||
@@ -18,9 +18,6 @@ resolver = "2"
|
|||||||
#parry3d-f64 = { path = "../parry/build/parry3d-f64" }
|
#parry3d-f64 = { path = "../parry/build/parry3d-f64" }
|
||||||
#nalgebra = { path = "../nalgebra" }
|
#nalgebra = { path = "../nalgebra" }
|
||||||
|
|
||||||
#bevy-orbit-controls = { path = "../bevy-orbit-controls" }
|
|
||||||
bevy-orbit-controls = { git = "https://github.com/sebcrozet/bevy-orbit-controls" }
|
|
||||||
|
|
||||||
#kiss3d = { git = "https://github.com/sebcrozet/kiss3d" }
|
#kiss3d = { git = "https://github.com/sebcrozet/kiss3d" }
|
||||||
#nalgebra = { git = "https://github.com/dimforge/nalgebra", branch = "dev" }
|
#nalgebra = { git = "https://github.com/dimforge/nalgebra", branch = "dev" }
|
||||||
#parry2d = { git = "https://github.com/dimforge/parry", branch = "special_cases" }
|
#parry2d = { git = "https://github.com/dimforge/parry", branch = "special_cases" }
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ enhanced-determinism = [ "rapier2d/enhanced-determinism" ]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
Inflector = "0.11"
|
Inflector = "0.11"
|
||||||
nalgebra = "0.26"
|
nalgebra = "0.27"
|
||||||
|
|
||||||
[dependencies.rapier_testbed2d]
|
[dependencies.rapier_testbed2d]
|
||||||
path = "../build/rapier_testbed2d"
|
path = "../build/rapier_testbed2d"
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet, RigidBodyType};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -22,7 +20,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let co = ColliderDesc::new(ground_shape)
|
let co = ColliderDesc::new(ground_shape)
|
||||||
.translation(-Vector2::y())
|
.translation(-Vector2::y())
|
||||||
.build(BodyPartHandle(ground_handle, 0));
|
.build(BodyPartHandle(ground_handle, 0));
|
||||||
colliders.insert(co);
|
colliders.insert_with_parent(co);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -48,10 +46,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new(status).translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,5 +59,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 2.5), 5.0);
|
testbed.look_at(point![0.0, 2.5], 5.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -19,23 +17,23 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.rotation(std::f32::consts::FRAC_PI_2)
|
.rotation(std::f32::consts::FRAC_PI_2)
|
||||||
.translation(ground_size, ground_size * 2.0)
|
.translation(vector![ground_size, ground_size * 2.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.rotation(std::f32::consts::FRAC_PI_2)
|
.rotation(std::f32::consts::FRAC_PI_2)
|
||||||
.translation(-ground_size, ground_size * 2.0)
|
.translation(vector![-ground_size, ground_size * 2.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -53,10 +51,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let y = j as f32 * shift + centery + 2.0;
|
let y = j as f32 * shift + centery + 2.0;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,5 +64,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 50.0), 10.0);
|
testbed.look_at(point![0.0, 50.0], 10.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -19,23 +17,23 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.rotation(std::f32::consts::FRAC_PI_2)
|
.rotation(std::f32::consts::FRAC_PI_2)
|
||||||
.translation(ground_size, ground_size * 4.0)
|
.translation(vector![ground_size, ground_size * 4.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size * 4.0, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size * 4.0, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.rotation(std::f32::consts::FRAC_PI_2)
|
.rotation(std::f32::consts::FRAC_PI_2)
|
||||||
.translation(-ground_size, ground_size * 4.0)
|
.translation(vector![-ground_size, ground_size * 4.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size * 4.0, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size * 4.0, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -55,10 +53,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let y = j as f32 * shifty + centery + 3.0;
|
let y = j as f32 * shifty + centery + 3.0;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::capsule_y(rad * 1.5, rad).build();
|
let collider = ColliderBuilder::capsule_y(rad * 1.5, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,5 +66,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 50.0), 10.0);
|
testbed.look_at(point![0.0, 50.0], 10.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
use na::Point2;
|
|
||||||
use rand::distributions::{Distribution, Standard};
|
use rand::distributions::{Distribution, Standard};
|
||||||
use rand::{rngs::StdRng, SeedableRng};
|
use rand::{rngs::StdRng, SeedableRng};
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -21,23 +19,23 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.rotation(std::f32::consts::FRAC_PI_2)
|
.rotation(std::f32::consts::FRAC_PI_2)
|
||||||
.translation(ground_size, ground_size * 2.0)
|
.translation(vector![ground_size, ground_size * 2.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.rotation(std::f32::consts::FRAC_PI_2)
|
.rotation(std::f32::consts::FRAC_PI_2)
|
||||||
.translation(-ground_size, ground_size * 2.0)
|
.translation(vector![-ground_size, ground_size * 2.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the convex polygons
|
* Create the convex polygons
|
||||||
@@ -58,18 +56,20 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let x = i as f32 * shift - centerx;
|
let x = i as f32 * shift - centerx;
|
||||||
let y = j as f32 * shift * 2.0 + centery + 2.0;
|
let y = j as f32 * shift * 2.0 + centery + 2.0;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let mut points = Vec::new();
|
let mut points = Vec::new();
|
||||||
|
|
||||||
for _ in 0..10 {
|
for _ in 0..10 {
|
||||||
let pt: Point2<f32> = distribution.sample(&mut rng);
|
let pt: Point<f32> = distribution.sample(&mut rng);
|
||||||
points.push(pt * scale);
|
points.push(pt * scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
let collider = ColliderBuilder::convex_hull(&points).unwrap().build();
|
let collider = ColliderBuilder::convex_hull(&points).unwrap().build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,5 +77,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 50.0), 10.0);
|
testbed.look_at(point![0.0, 50.0], 10.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use na::{DVector, Point2, Vector2};
|
use na::DVector;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -14,7 +13,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
/*
|
/*
|
||||||
* Ground
|
* Ground
|
||||||
*/
|
*/
|
||||||
let ground_size = Vector2::new(50.0, 1.0);
|
let ground_size = Vector::new(50.0, 1.0);
|
||||||
let nsubdivs = 2000;
|
let nsubdivs = 2000;
|
||||||
|
|
||||||
let heights = DVector::from_fn(nsubdivs + 1, |i, _| {
|
let heights = DVector::from_fn(nsubdivs + 1, |i, _| {
|
||||||
@@ -28,7 +27,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::heightfield(heights, ground_size).build();
|
let collider = ColliderBuilder::heightfield(heights, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -46,15 +45,17 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let y = j as f32 * shift + centery + 3.0;
|
let y = j as f32 * shift + centery + 3.0;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
if j % 2 == 0 {
|
if j % 2 == 0 {
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
} else {
|
} else {
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,5 +64,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 50.0), 10.0);
|
testbed.look_at(point![0.0, 50.0], 10.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{BallJoint, JointSet, RigidBodyBuilder, RigidBodySet, RigidBodyType};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -34,16 +32,16 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new(status)
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
.translation(fk * shift, -fi * shift)
|
.translation(vector![fk * shift, -fi * shift])
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, &mut bodies);
|
colliders.insert_with_parent(collider, child_handle, &mut bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
let parent_handle = *body_handles.last().unwrap();
|
let parent_handle = *body_handles.last().unwrap();
|
||||||
let joint = BallJoint::new(Point2::origin(), Point2::new(0.0, shift));
|
let joint = BallJoint::new(Point::origin(), point![0.0, shift]);
|
||||||
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +49,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
if k > 0 {
|
if k > 0 {
|
||||||
let parent_index = body_handles.len() - numi;
|
let parent_index = body_handles.len() - numi;
|
||||||
let parent_handle = body_handles[parent_index];
|
let parent_handle = body_handles[parent_index];
|
||||||
let joint = BallJoint::new(Point2::origin(), Point2::new(-shift, 0.0));
|
let joint = BallJoint::new(Point::origin(), point![-shift, 0.0]);
|
||||||
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,5 +61,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(numk as f32 * rad, numi as f32 * -rad), 5.0);
|
testbed.look_at(point![numk as f32 * rad, numi as f32 * -rad], 5.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Isometry2, Point2};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{FixedJoint, JointSet, RigidBodyBuilder, RigidBodySet, RigidBodyType};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -39,18 +37,18 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new(status)
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
.translation(x + fk * shift, y - fi * shift)
|
.translation(vector![x + fk * shift, y - fi * shift])
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, &mut bodies);
|
colliders.insert_with_parent(collider, child_handle, &mut bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
let parent_handle = *body_handles.last().unwrap();
|
let parent_handle = *body_handles.last().unwrap();
|
||||||
let joint = FixedJoint::new(
|
let joint = FixedJoint::new(
|
||||||
Isometry2::identity(),
|
Isometry::identity(),
|
||||||
Isometry2::translation(0.0, shift),
|
Isometry::translation(0.0, shift),
|
||||||
);
|
);
|
||||||
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
@@ -60,8 +58,8 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let parent_index = body_handles.len() - num;
|
let parent_index = body_handles.len() - num;
|
||||||
let parent_handle = body_handles[parent_index];
|
let parent_handle = body_handles[parent_index];
|
||||||
let joint = FixedJoint::new(
|
let joint = FixedJoint::new(
|
||||||
Isometry2::identity(),
|
Isometry::identity(),
|
||||||
Isometry2::translation(-shift, 0.0),
|
Isometry::translation(-shift, 0.0),
|
||||||
);
|
);
|
||||||
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
@@ -76,5 +74,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(50.0, 50.0), 5.0);
|
testbed.look_at(point![50.0, 50.0], 5.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point2, Unit, Vector2};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, PrismaticJoint, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -25,27 +23,31 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
for j in 0..50 {
|
for j in 0..50 {
|
||||||
let x = j as f32 * shift * 4.0;
|
let x = j as f32 * shift * 4.0;
|
||||||
|
|
||||||
let ground = RigidBodyBuilder::new_static().translation(x, y).build();
|
let ground = RigidBodyBuilder::new_static()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let mut curr_parent = bodies.insert(ground);
|
let mut curr_parent = bodies.insert(ground);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, curr_parent, &mut bodies);
|
colliders.insert_with_parent(collider, curr_parent, &mut bodies);
|
||||||
|
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
let y = y - (i + 1) as f32 * shift;
|
let y = y - (i + 1) as f32 * shift;
|
||||||
let density = 1.0;
|
let density = 1.0;
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let curr_child = bodies.insert(rigid_body);
|
let curr_child = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).density(density).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).density(density).build();
|
||||||
colliders.insert(collider, curr_child, &mut bodies);
|
colliders.insert_with_parent(collider, curr_child, &mut bodies);
|
||||||
|
|
||||||
let axis = if i % 2 == 0 {
|
let axis = if i % 2 == 0 {
|
||||||
Unit::new_normalize(Vector2::new(1.0, 1.0))
|
UnitVector::new_normalize(vector![1.0, 1.0])
|
||||||
} else {
|
} else {
|
||||||
Unit::new_normalize(Vector2::new(-1.0, 1.0))
|
UnitVector::new_normalize(vector![-1.0, 1.0])
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut prism =
|
let mut prism =
|
||||||
PrismaticJoint::new(Point2::origin(), axis, Point2::new(0.0, shift), axis);
|
PrismaticJoint::new(Point::origin(), axis, point![0.0, shift], axis);
|
||||||
prism.limits_enabled = true;
|
prism.limits_enabled = true;
|
||||||
prism.limits[0] = -1.5;
|
prism.limits[0] = -1.5;
|
||||||
prism.limits[1] = 1.5;
|
prism.limits[1] = 1.5;
|
||||||
@@ -60,5 +62,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(80.0, 80.0), 15.0);
|
testbed.look_at(point![80.0, 80.0], 15.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -20,7 +18,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_thickness).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_thickness).build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -40,10 +38,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let y = fi * shift + centery;
|
let y = fi * shift + centery;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,5 +51,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 2.5), 5.0);
|
testbed.look_at(point![0.0, 2.5], 5.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ enhanced-determinism = [ "rapier3d/enhanced-determinism" ]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
Inflector = "0.11"
|
Inflector = "0.11"
|
||||||
nalgebra = "0.26"
|
nalgebra = "0.27"
|
||||||
|
|
||||||
[dependencies.rapier_testbed3d]
|
[dependencies.rapier_testbed3d]
|
||||||
path = "../build/rapier_testbed3d"
|
path = "../build/rapier_testbed3d"
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet, RigidBodyType};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -37,10 +35,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let density = 0.477;
|
let density = 0.477;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new(status).translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).density(density).build();
|
let collider = ColliderBuilder::ball(rad).density(density).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -49,5 +49,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -45,10 +43,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shift - centerz + offset;
|
let z = k as f32 * shift - centerz + offset;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,5 +59,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -46,10 +44,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shift - centerz + offset;
|
let z = k as f32 * shift - centerz + offset;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::capsule_y(rad, rad).build();
|
let collider = ColliderBuilder::capsule_y(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,5 +60,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -49,8 +47,8 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(x, y, z)
|
.translation(vector![x, y, z])
|
||||||
.linvel(0.0, -1000.0, 0.0)
|
.linvel(vector![0.0, -1000.0, 0.0])
|
||||||
.ccd_enabled(true)
|
.ccd_enabled(true)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
@@ -65,7 +63,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
_ => ColliderBuilder::capsule_y(rad, rad),
|
_ => ColliderBuilder::capsule_y(rad, rad),
|
||||||
};
|
};
|
||||||
|
|
||||||
colliders.insert(collider.build(), handle, &mut bodies);
|
colliders.insert_with_parent(collider.build(), handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,5 +74,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -45,18 +43,20 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shift * 2.0 - centerz + offset;
|
let z = k as f32 * shift * 2.0 - centerz + offset;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider1 = ColliderBuilder::cuboid(rad * 10.0, rad, rad).build();
|
let collider1 = ColliderBuilder::cuboid(rad * 10.0, rad, rad).build();
|
||||||
let collider2 = ColliderBuilder::cuboid(rad, rad * 10.0, rad)
|
let collider2 = ColliderBuilder::cuboid(rad, rad * 10.0, rad)
|
||||||
.translation(rad * 10.0, rad * 10.0, 0.0)
|
.translation(vector![rad * 10.0, rad * 10.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let collider3 = ColliderBuilder::cuboid(rad, rad * 10.0, rad)
|
let collider3 = ColliderBuilder::cuboid(rad, rad * 10.0, rad)
|
||||||
.translation(-rad * 10.0, rad * 10.0, 0.0)
|
.translation(vector![-rad * 10.0, rad * 10.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider1, handle, &mut bodies);
|
colliders.insert_with_parent(collider1, handle, &mut bodies);
|
||||||
colliders.insert(collider2, handle, &mut bodies);
|
colliders.insert_with_parent(collider2, handle, &mut bodies);
|
||||||
colliders.insert(collider3, handle, &mut bodies);
|
colliders.insert_with_parent(collider3, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,5 +67,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
use na::Point3;
|
|
||||||
use rand::distributions::{Distribution, Standard};
|
use rand::distributions::{Distribution, Standard};
|
||||||
use rand::{rngs::StdRng, SeedableRng};
|
use rand::{rngs::StdRng, SeedableRng};
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -20,11 +18,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -53,17 +51,19 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
let mut points = Vec::new();
|
let mut points = Vec::new();
|
||||||
for _ in 0..10 {
|
for _ in 0..10 {
|
||||||
let pt: Point3<f32> = distribution.sample(&mut rng);
|
let pt: Point<f32> = distribution.sample(&mut rng);
|
||||||
points.push(pt * scale);
|
points.push(pt * scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::round_convex_hull(&points, border_rad)
|
let collider = ColliderBuilder::round_convex_hull(&points, border_rad)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,5 +74,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use na::{ComplexField, DMatrix, Point3, Vector3};
|
use na::ComplexField;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -14,7 +13,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
/*
|
/*
|
||||||
* Ground
|
* Ground
|
||||||
*/
|
*/
|
||||||
let ground_size = Vector3::new(200.0, 1.0, 200.0);
|
let ground_size = vector![200.0, 1.0, 200.0];
|
||||||
let nsubdivs = 20;
|
let nsubdivs = 20;
|
||||||
|
|
||||||
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
||||||
@@ -34,7 +33,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::heightfield(heights, ground_size).build();
|
let collider = ColliderBuilder::heightfield(heights, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -55,15 +54,17 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shift - centerz;
|
let z = k as f32 * shift - centerz;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
if j % 2 == 0 {
|
if j % 2 == 0 {
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
} else {
|
} else {
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,5 +74,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{BallJoint, JointSet, RigidBodyBuilder, RigidBodySet, RigidBodyType};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -29,16 +27,16 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new(status)
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
.translation(fk * shift, 0.0, fi * shift)
|
.translation(vector![fk * shift, 0.0, fi * shift])
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, &mut bodies);
|
colliders.insert_with_parent(collider, child_handle, &mut bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
let parent_handle = *body_handles.last().unwrap();
|
let parent_handle = *body_handles.last().unwrap();
|
||||||
let joint = BallJoint::new(Point3::origin(), Point3::new(0.0, 0.0, -shift));
|
let joint = BallJoint::new(Point::origin(), point![0.0, 0.0, -shift]);
|
||||||
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,7 +44,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
if k > 0 {
|
if k > 0 {
|
||||||
let parent_index = body_handles.len() - num;
|
let parent_index = body_handles.len() - num;
|
||||||
let parent_handle = body_handles[parent_index];
|
let parent_handle = body_handles[parent_index];
|
||||||
let joint = BallJoint::new(Point3::origin(), Point3::new(-shift, 0.0, 0.0));
|
let joint = BallJoint::new(Point::origin(), point![-shift, 0.0, 0.0]);
|
||||||
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,8 +56,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(
|
testbed.look_at(point![-110.0, -46.0, 170.0], point![54.0, -38.0, 29.0]);
|
||||||
Point3::new(-110.0, -46.0, 170.0),
|
|
||||||
Point3::new(54.0, -38.0, 29.0),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Isometry3, Point3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{FixedJoint, JointSet, RigidBodyBuilder, RigidBodySet, RigidBodyType};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -42,18 +40,18 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new(status)
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
.translation(x + fk * shift, y, z + fi * shift)
|
.translation(vector![x + fk * shift, y, z + fi * shift])
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, &mut bodies);
|
colliders.insert_with_parent(collider, child_handle, &mut bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
let parent_handle = *body_handles.last().unwrap();
|
let parent_handle = *body_handles.last().unwrap();
|
||||||
let joint = FixedJoint::new(
|
let joint = FixedJoint::new(
|
||||||
Isometry3::identity(),
|
Isometry::identity(),
|
||||||
Isometry3::translation(0.0, 0.0, -shift),
|
Isometry::translation(0.0, 0.0, -shift),
|
||||||
);
|
);
|
||||||
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
@@ -63,8 +61,8 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let parent_index = body_handles.len() - num;
|
let parent_index = body_handles.len() - num;
|
||||||
let parent_handle = body_handles[parent_index];
|
let parent_handle = body_handles[parent_index];
|
||||||
let joint = FixedJoint::new(
|
let joint = FixedJoint::new(
|
||||||
Isometry3::identity(),
|
Isometry::identity(),
|
||||||
Isometry3::translation(-shift, 0.0, 0.0),
|
Isometry::translation(-shift, 0.0, 0.0),
|
||||||
);
|
);
|
||||||
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
@@ -80,8 +78,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(
|
testbed.look_at(point![-38.0, 14.0, 108.0], point![46.0, 12.0, 23.0]);
|
||||||
Point3::new(-38.0, 14.0, 108.0),
|
|
||||||
Point3::new(46.0, 12.0, 23.0),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point3, Unit, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, PrismaticJoint, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -24,33 +22,37 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
for j in 0..50 {
|
for j in 0..50 {
|
||||||
let x = j as f32 * shift * 4.0;
|
let x = j as f32 * shift * 4.0;
|
||||||
|
|
||||||
let ground = RigidBodyBuilder::new_static().translation(x, y, z).build();
|
let ground = RigidBodyBuilder::new_static()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let mut curr_parent = bodies.insert(ground);
|
let mut curr_parent = bodies.insert(ground);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, curr_parent, &mut bodies);
|
colliders.insert_with_parent(collider, curr_parent, &mut bodies);
|
||||||
|
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
let z = z + (i + 1) as f32 * shift;
|
let z = z + (i + 1) as f32 * shift;
|
||||||
let density = 1.0;
|
let density = 1.0;
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let curr_child = bodies.insert(rigid_body);
|
let curr_child = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad)
|
let collider = ColliderBuilder::cuboid(rad, rad, rad)
|
||||||
.density(density)
|
.density(density)
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, curr_child, &mut bodies);
|
colliders.insert_with_parent(collider, curr_child, &mut bodies);
|
||||||
|
|
||||||
let axis = if i % 2 == 0 {
|
let axis = if i % 2 == 0 {
|
||||||
Unit::new_normalize(Vector3::new(1.0, 1.0, 0.0))
|
UnitVector::new_normalize(vector![1.0, 1.0, 0.0])
|
||||||
} else {
|
} else {
|
||||||
Unit::new_normalize(Vector3::new(-1.0, 1.0, 0.0))
|
UnitVector::new_normalize(vector![-1.0, 1.0, 0.0])
|
||||||
};
|
};
|
||||||
|
|
||||||
let z = Vector3::z();
|
let z = Vector::z();
|
||||||
let mut prism = PrismaticJoint::new(
|
let mut prism = PrismaticJoint::new(
|
||||||
Point3::origin(),
|
Point::origin(),
|
||||||
axis,
|
axis,
|
||||||
z,
|
z,
|
||||||
Point3::new(0.0, 0.0, -shift),
|
point![0.0, 0.0, -shift],
|
||||||
axis,
|
axis,
|
||||||
z,
|
z,
|
||||||
);
|
);
|
||||||
@@ -69,8 +71,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(
|
testbed.look_at(point![262.0, 63.0, 124.0], point![101.0, 4.0, -3.0]);
|
||||||
Point3::new(262.0, 63.0, 124.0),
|
|
||||||
Point3::new(101.0, 4.0, -3.0),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Isometry3, Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RevoluteJoint, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -22,20 +20,20 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let x = j as f32 * shift * 4.0;
|
let x = j as f32 * shift * 4.0;
|
||||||
|
|
||||||
let ground = RigidBodyBuilder::new_static()
|
let ground = RigidBodyBuilder::new_static()
|
||||||
.translation(x, y, 0.0)
|
.translation(vector![x, y, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let mut curr_parent = bodies.insert(ground);
|
let mut curr_parent = bodies.insert(ground);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, curr_parent, &mut bodies);
|
colliders.insert_with_parent(collider, curr_parent, &mut bodies);
|
||||||
|
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
// Create four bodies.
|
// Create four bodies.
|
||||||
let z = i as f32 * shift * 2.0 + shift;
|
let z = i as f32 * shift * 2.0 + shift;
|
||||||
let positions = [
|
let positions = [
|
||||||
Isometry3::translation(x, y, z),
|
Isometry::translation(x, y, z),
|
||||||
Isometry3::translation(x + shift, y, z),
|
Isometry::translation(x + shift, y, z),
|
||||||
Isometry3::translation(x + shift, y, z + shift),
|
Isometry::translation(x + shift, y, z + shift),
|
||||||
Isometry3::translation(x, y, z + shift),
|
Isometry::translation(x, y, z + shift),
|
||||||
];
|
];
|
||||||
|
|
||||||
let mut handles = [curr_parent; 4];
|
let mut handles = [curr_parent; 4];
|
||||||
@@ -48,19 +46,19 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad)
|
let collider = ColliderBuilder::cuboid(rad, rad, rad)
|
||||||
.density(density)
|
.density(density)
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, handles[k], &mut bodies);
|
colliders.insert_with_parent(collider, handles[k], &mut bodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup four joints.
|
// Setup four joints.
|
||||||
let o = Point3::origin();
|
let o = Point::origin();
|
||||||
let x = Vector3::x_axis();
|
let x = Vector::x_axis();
|
||||||
let z = Vector3::z_axis();
|
let z = Vector::z_axis();
|
||||||
|
|
||||||
let revs = [
|
let revs = [
|
||||||
RevoluteJoint::new(o, z, Point3::new(0.0, 0.0, -shift), z),
|
RevoluteJoint::new(o, z, point![0.0, 0.0, -shift], z),
|
||||||
RevoluteJoint::new(o, x, Point3::new(-shift, 0.0, 0.0), x),
|
RevoluteJoint::new(o, x, point![-shift, 0.0, 0.0], x),
|
||||||
RevoluteJoint::new(o, z, Point3::new(0.0, 0.0, -shift), z),
|
RevoluteJoint::new(o, z, point![0.0, 0.0, -shift], z),
|
||||||
RevoluteJoint::new(o, x, Point3::new(shift, 0.0, 0.0), x),
|
RevoluteJoint::new(o, x, point![shift, 0.0, 0.0], x),
|
||||||
];
|
];
|
||||||
|
|
||||||
joints.insert(&mut bodies, curr_parent, handles[0], revs[0]);
|
joints.insert(&mut bodies, curr_parent, handles[0], revs[0]);
|
||||||
@@ -77,8 +75,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(
|
testbed.look_at(point![478.0, 83.0, 228.0], point![134.0, 83.0, -116.0]);
|
||||||
Point3::new(478.0, 83.0, 228.0),
|
|
||||||
Point3::new(134.0, 83.0, -116.0),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn build_block(
|
pub fn build_block(
|
||||||
testbed: &mut Testbed,
|
testbed: &mut Testbed,
|
||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
half_extents: Vector3<f32>,
|
half_extents: Vector<f32>,
|
||||||
shift: Vector3<f32>,
|
shift: Vector<f32>,
|
||||||
mut numx: usize,
|
mut numx: usize,
|
||||||
numy: usize,
|
numy: usize,
|
||||||
mut numz: usize,
|
mut numz: usize,
|
||||||
@@ -17,8 +15,8 @@ pub fn build_block(
|
|||||||
let block_width = 2.0 * half_extents.z * numx as f32;
|
let block_width = 2.0 * half_extents.z * numx as f32;
|
||||||
let block_height = 2.0 * half_extents.y * numy as f32;
|
let block_height = 2.0 * half_extents.y * numy as f32;
|
||||||
let spacing = (half_extents.z * numx as f32 - half_extents.x) / (numz as f32 - 1.0);
|
let spacing = (half_extents.z * numx as f32 - half_extents.x) / (numz as f32 - 1.0);
|
||||||
let mut color0 = Point3::new(0.7, 0.5, 0.9);
|
let mut color0 = [0.7, 0.5, 0.9];
|
||||||
let mut color1 = Point3::new(0.6, 1.0, 0.6);
|
let mut color1 = [0.6, 1.0, 0.6];
|
||||||
|
|
||||||
for i in 0..numy {
|
for i in 0..numy {
|
||||||
std::mem::swap(&mut numx, &mut numz);
|
std::mem::swap(&mut numx, &mut numz);
|
||||||
@@ -41,15 +39,15 @@ pub fn build_block(
|
|||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(
|
.translation(vector![
|
||||||
x + dim.x + shift.x,
|
x + dim.x + shift.x,
|
||||||
y + dim.y + shift.y,
|
y + dim.y + shift.y,
|
||||||
z + dim.z + shift.z,
|
z + dim.z + shift.z
|
||||||
)
|
])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert_with_parent(collider, handle, bodies);
|
||||||
|
|
||||||
testbed.set_initial_body_color(handle, color0);
|
testbed.set_initial_body_color(handle, color0);
|
||||||
std::mem::swap(&mut color0, &mut color1);
|
std::mem::swap(&mut color0, &mut color1);
|
||||||
@@ -64,15 +62,15 @@ pub fn build_block(
|
|||||||
for j in 0..(block_width / (dim.z as f32 * 2.0)) as usize {
|
for j in 0..(block_width / (dim.z as f32 * 2.0)) as usize {
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(
|
.translation(vector![
|
||||||
i as f32 * dim.x * 2.0 + dim.x + shift.x,
|
i as f32 * dim.x * 2.0 + dim.x + shift.x,
|
||||||
dim.y + shift.y + block_height,
|
dim.y + shift.y + block_height,
|
||||||
j as f32 * dim.z * 2.0 + dim.z + shift.z,
|
j as f32 * dim.z * 2.0 + dim.z + shift.z
|
||||||
)
|
])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert_with_parent(collider, handle, bodies);
|
||||||
testbed.set_initial_body_color(handle, color0);
|
testbed.set_initial_body_color(handle, color0);
|
||||||
std::mem::swap(&mut color0, &mut color1);
|
std::mem::swap(&mut color0, &mut color1);
|
||||||
}
|
}
|
||||||
@@ -94,16 +92,16 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
*/
|
*/
|
||||||
let half_extents = Vector3::new(0.02, 0.1, 0.4) / 2.0 * 10.0;
|
let half_extents = vector![0.02, 0.1, 0.4] / 2.0 * 10.0;
|
||||||
let mut block_height = 0.0;
|
let mut block_height = 0.0;
|
||||||
// These should only be set to odd values otherwise
|
// These should only be set to odd values otherwise
|
||||||
// the blocks won't align in the nicest way.
|
// the blocks won't align in the nicest way.
|
||||||
@@ -120,7 +118,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
half_extents,
|
half_extents,
|
||||||
Vector3::new(-block_width / 2.0, block_height, -block_width / 2.0),
|
vector![-block_width / 2.0, block_height, -block_width / 2.0],
|
||||||
numx,
|
numx,
|
||||||
numy,
|
numy,
|
||||||
numz,
|
numz,
|
||||||
@@ -135,5 +133,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
fn create_pyramid(
|
fn create_pyramid(
|
||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
offset: Vector3<f32>,
|
offset: Vector<f32>,
|
||||||
stack_height: usize,
|
stack_height: usize,
|
||||||
half_extents: Vector3<f32>,
|
half_extents: Vector<f32>,
|
||||||
) {
|
) {
|
||||||
let shift = half_extents * 2.5;
|
let shift = half_extents * 2.5;
|
||||||
for i in 0usize..stack_height {
|
for i in 0usize..stack_height {
|
||||||
@@ -24,12 +22,14 @@ fn create_pyramid(
|
|||||||
- stack_height as f32 * half_extents.z;
|
- stack_height as f32 * half_extents.z;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let rigid_body_handle = bodies.insert(rigid_body);
|
let rigid_body_handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let collider =
|
let collider =
|
||||||
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
colliders.insert(collider, rigid_body_handle, bodies);
|
colliders.insert_with_parent(collider, rigid_body_handle, bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -50,22 +50,22 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
*/
|
*/
|
||||||
let cube_size = 1.0;
|
let cube_size = 1.0;
|
||||||
let hext = Vector3::repeat(cube_size);
|
let hext = Vector::repeat(cube_size);
|
||||||
let bottomy = cube_size;
|
let bottomy = cube_size;
|
||||||
create_pyramid(
|
create_pyramid(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(0.0, bottomy, 0.0),
|
vector![0.0, bottomy, 0.0],
|
||||||
24,
|
24,
|
||||||
hext,
|
hext,
|
||||||
);
|
);
|
||||||
@@ -74,5 +74,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
use na::{Point3, Translation3, UnitQuaternion, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
fn create_tower_circle(
|
fn create_tower_circle(
|
||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
offset: Vector3<f32>,
|
offset: Vector<f32>,
|
||||||
stack_height: usize,
|
stack_height: usize,
|
||||||
nsubdivs: usize,
|
nsubdivs: usize,
|
||||||
half_extents: Vector3<f32>,
|
half_extents: Vector<f32>,
|
||||||
) {
|
) {
|
||||||
let ang_step = std::f32::consts::PI * 2.0 / nsubdivs as f32;
|
let ang_step = std::f32::consts::PI * 2.0 / nsubdivs as f32;
|
||||||
let radius = 1.3 * nsubdivs as f32 * half_extents.x / std::f32::consts::PI;
|
let radius = 1.3 * nsubdivs as f32 * half_extents.x / std::f32::consts::PI;
|
||||||
@@ -20,16 +18,16 @@ fn create_tower_circle(
|
|||||||
let fj = j as f32;
|
let fj = j as f32;
|
||||||
let fi = i as f32;
|
let fi = i as f32;
|
||||||
let y = fi * shift.y;
|
let y = fi * shift.y;
|
||||||
let pos = Translation3::from(offset)
|
let pos = Translation::from(offset)
|
||||||
* UnitQuaternion::new(Vector3::y() * (fi / 2.0 + fj) * ang_step)
|
* Rotation::new(Vector::y() * (fi / 2.0 + fj) * ang_step)
|
||||||
* Translation3::new(0.0, y, radius);
|
* Translation::new(0.0, y, radius);
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().position(pos).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().position(pos).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider =
|
let collider =
|
||||||
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert_with_parent(collider, handle, bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,9 +35,9 @@ fn create_tower_circle(
|
|||||||
fn create_wall(
|
fn create_wall(
|
||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
offset: Vector3<f32>,
|
offset: Vector<f32>,
|
||||||
stack_height: usize,
|
stack_height: usize,
|
||||||
half_extents: Vector3<f32>,
|
half_extents: Vector<f32>,
|
||||||
) {
|
) {
|
||||||
let shift = half_extents * 2.0;
|
let shift = half_extents * 2.0;
|
||||||
for i in 0usize..stack_height {
|
for i in 0usize..stack_height {
|
||||||
@@ -52,11 +50,13 @@ fn create_wall(
|
|||||||
- stack_height as f32 * half_extents.z;
|
- stack_height as f32 * half_extents.z;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider =
|
let collider =
|
||||||
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert_with_parent(collider, handle, bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,9 +64,9 @@ fn create_wall(
|
|||||||
fn create_pyramid(
|
fn create_pyramid(
|
||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
offset: Vector3<f32>,
|
offset: Vector<f32>,
|
||||||
stack_height: usize,
|
stack_height: usize,
|
||||||
half_extents: Vector3<f32>,
|
half_extents: Vector<f32>,
|
||||||
) {
|
) {
|
||||||
let shift = half_extents * 2.0;
|
let shift = half_extents * 2.0;
|
||||||
|
|
||||||
@@ -83,11 +83,13 @@ fn create_pyramid(
|
|||||||
- stack_height as f32 * half_extents.z;
|
- stack_height as f32 * half_extents.z;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider =
|
let collider =
|
||||||
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert_with_parent(collider, handle, bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,71 +110,71 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
*/
|
*/
|
||||||
let cube_size = 1.0;
|
let cube_size = 1.0;
|
||||||
let hext = Vector3::repeat(cube_size);
|
let hext = Vector::repeat(cube_size);
|
||||||
let bottomy = cube_size * 50.0;
|
let bottomy = cube_size * 50.0;
|
||||||
create_pyramid(
|
create_pyramid(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(-110.0, bottomy, 0.0),
|
vector![-110.0, bottomy, 0.0],
|
||||||
12,
|
12,
|
||||||
hext,
|
hext,
|
||||||
);
|
);
|
||||||
create_pyramid(
|
create_pyramid(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(-80.0, bottomy, 0.0),
|
vector![-80.0, bottomy, 0.0],
|
||||||
12,
|
12,
|
||||||
hext,
|
hext,
|
||||||
);
|
);
|
||||||
create_pyramid(
|
create_pyramid(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(-50.0, bottomy, 0.0),
|
vector![-50.0, bottomy, 0.0],
|
||||||
12,
|
12,
|
||||||
hext,
|
hext,
|
||||||
);
|
);
|
||||||
create_pyramid(
|
create_pyramid(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(-20.0, bottomy, 0.0),
|
vector![-20.0, bottomy, 0.0],
|
||||||
12,
|
12,
|
||||||
hext,
|
hext,
|
||||||
);
|
);
|
||||||
create_wall(
|
create_wall(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(-2.0, bottomy, 0.0),
|
vector![-2.0, bottomy, 0.0],
|
||||||
12,
|
12,
|
||||||
hext,
|
hext,
|
||||||
);
|
);
|
||||||
create_wall(
|
create_wall(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(4.0, bottomy, 0.0),
|
vector![4.0, bottomy, 0.0],
|
||||||
12,
|
12,
|
||||||
hext,
|
hext,
|
||||||
);
|
);
|
||||||
create_wall(
|
create_wall(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(10.0, bottomy, 0.0),
|
vector![10.0, bottomy, 0.0],
|
||||||
12,
|
12,
|
||||||
hext,
|
hext,
|
||||||
);
|
);
|
||||||
create_tower_circle(
|
create_tower_circle(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(25.0, bottomy, 0.0),
|
vector![25.0, bottomy, 0.0],
|
||||||
8,
|
8,
|
||||||
24,
|
24,
|
||||||
hext,
|
hext,
|
||||||
@@ -182,5 +184,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use na::{ComplexField, DMatrix, Point3, Vector3};
|
use na::ComplexField;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet, HeightField};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -14,7 +13,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
/*
|
/*
|
||||||
* Ground
|
* Ground
|
||||||
*/
|
*/
|
||||||
let ground_size = Vector3::new(200.0, 1.0, 200.0);
|
let ground_size = vector![200.0, 1.0, 200.0];
|
||||||
let nsubdivs = 20;
|
let nsubdivs = 20;
|
||||||
|
|
||||||
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
||||||
@@ -39,7 +38,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::trimesh(vertices, indices).build();
|
let collider = ColliderBuilder::trimesh(vertices, indices).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -60,15 +59,17 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shift - centerz;
|
let z = k as f32 * shift - centerz;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
if j % 2 == 0 {
|
if j % 2 == 0 {
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
} else {
|
} else {
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,5 +79,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,13 +44,13 @@ required-features = [ "dim2", "f64" ]
|
|||||||
vec_map = { version = "0.8", optional = true }
|
vec_map = { version = "0.8", optional = true }
|
||||||
instant = { version = "0.1", features = [ "now" ]}
|
instant = { version = "0.1", features = [ "now" ]}
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
nalgebra = "0.26"
|
nalgebra = "0.27"
|
||||||
parry2d-f64 = "0.4"
|
parry2d-f64 = "0.5"
|
||||||
simba = "0.4"
|
simba = "0.5"
|
||||||
approx = "0.4"
|
approx = "0.5"
|
||||||
rayon = { version = "1", optional = true }
|
rayon = { version = "1", optional = true }
|
||||||
crossbeam = "0.8"
|
crossbeam = "0.8"
|
||||||
arrayvec = "0.6"
|
arrayvec = "0.7"
|
||||||
bit-vec = "0.6"
|
bit-vec = "0.6"
|
||||||
rustc-hash = "1"
|
rustc-hash = "1"
|
||||||
serde = { version = "1", features = [ "derive" ], optional = true }
|
serde = { version = "1", features = [ "derive" ], optional = true }
|
||||||
|
|||||||
@@ -44,13 +44,13 @@ required-features = [ "dim2", "f32" ]
|
|||||||
vec_map = { version = "0.8", optional = true }
|
vec_map = { version = "0.8", optional = true }
|
||||||
instant = { version = "0.1", features = [ "now" ]}
|
instant = { version = "0.1", features = [ "now" ]}
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
nalgebra = "0.26"
|
nalgebra = "0.27"
|
||||||
parry2d = "0.4"
|
parry2d = "0.5"
|
||||||
simba = "0.4"
|
simba = "0.5"
|
||||||
approx = "0.4"
|
approx = "0.5"
|
||||||
rayon = { version = "1", optional = true }
|
rayon = { version = "1", optional = true }
|
||||||
crossbeam = "0.8"
|
crossbeam = "0.8"
|
||||||
arrayvec = "0.6"
|
arrayvec = "0.7"
|
||||||
bit-vec = "0.6"
|
bit-vec = "0.6"
|
||||||
rustc-hash = "1"
|
rustc-hash = "1"
|
||||||
serde = { version = "1", features = [ "derive" ], optional = true }
|
serde = { version = "1", features = [ "derive" ], optional = true }
|
||||||
|
|||||||
@@ -44,13 +44,13 @@ required-features = [ "dim3", "f64" ]
|
|||||||
vec_map = { version = "0.8", optional = true }
|
vec_map = { version = "0.8", optional = true }
|
||||||
instant = { version = "0.1", features = [ "now" ]}
|
instant = { version = "0.1", features = [ "now" ]}
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
nalgebra = "0.26"
|
nalgebra = "0.27"
|
||||||
parry3d-f64 = "0.4"
|
parry3d-f64 = "0.5"
|
||||||
simba = "0.4"
|
simba = "0.5"
|
||||||
approx = "0.4"
|
approx = "0.5"
|
||||||
rayon = { version = "1", optional = true }
|
rayon = { version = "1", optional = true }
|
||||||
crossbeam = "0.8"
|
crossbeam = "0.8"
|
||||||
arrayvec = "0.6"
|
arrayvec = "0.7"
|
||||||
bit-vec = "0.6"
|
bit-vec = "0.6"
|
||||||
rustc-hash = "1"
|
rustc-hash = "1"
|
||||||
serde = { version = "1", features = [ "derive" ], optional = true }
|
serde = { version = "1", features = [ "derive" ], optional = true }
|
||||||
|
|||||||
@@ -44,13 +44,13 @@ required-features = [ "dim3", "f32" ]
|
|||||||
vec_map = { version = "0.8", optional = true }
|
vec_map = { version = "0.8", optional = true }
|
||||||
instant = { version = "0.1", features = [ "now" ]}
|
instant = { version = "0.1", features = [ "now" ]}
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
nalgebra = "0.26"
|
nalgebra = "0.27"
|
||||||
parry3d = "0.4"
|
parry3d = "0.5"
|
||||||
simba = "0.4"
|
simba = "0.5"
|
||||||
approx = "0.4"
|
approx = "0.5"
|
||||||
rayon = { version = "1", optional = true }
|
rayon = { version = "1", optional = true }
|
||||||
crossbeam = "0.8"
|
crossbeam = "0.8"
|
||||||
arrayvec = "0.6"
|
arrayvec = "0.7"
|
||||||
bit-vec = "0.6"
|
bit-vec = "0.6"
|
||||||
rustc-hash = "1"
|
rustc-hash = "1"
|
||||||
serde = { version = "1", features = [ "derive" ], optional = true }
|
serde = { version = "1", features = [ "derive" ], optional = true }
|
||||||
|
|||||||
@@ -26,23 +26,22 @@ other-backends = [ "wrapped2d", "nphysics2d" ]
|
|||||||
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nalgebra = { version = "0.26", features = [ "rand" ] }
|
nalgebra = { version = "0.27", features = [ "rand" ] }
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
rand_pcg = "0.3"
|
rand_pcg = "0.3"
|
||||||
instant = { version = "0.1", features = [ "web-sys", "now" ]}
|
instant = { version = "0.1", features = [ "web-sys", "now" ]}
|
||||||
bitflags = "1"
|
bitflags = "1"
|
||||||
num_cpus = { version = "1", optional = true }
|
num_cpus = { version = "1", optional = true }
|
||||||
wrapped2d = { version = "0.4", optional = true }
|
wrapped2d = { version = "0.4", optional = true }
|
||||||
parry2d = "0.4"
|
parry2d = "0.5"
|
||||||
ncollide2d = "0.29"
|
ncollide2d = "0.30"
|
||||||
nphysics2d = { version = "0.21", optional = true }
|
nphysics2d = { version = "0.22", optional = true }
|
||||||
crossbeam = "0.8"
|
crossbeam = "0.8"
|
||||||
bincode = "1"
|
bincode = "1"
|
||||||
Inflector = "0.11"
|
Inflector = "0.11"
|
||||||
md5 = "0.7"
|
md5 = "0.7"
|
||||||
|
|
||||||
bevy_egui = "0.4"
|
bevy_egui = "0.5"
|
||||||
bevy-orbit-controls = "2"
|
|
||||||
|
|
||||||
# Dependencies for native only.
|
# Dependencies for native only.
|
||||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||||
|
|||||||
@@ -25,16 +25,16 @@ parallel = [ "rapier3d/parallel", "num_cpus" ]
|
|||||||
other-backends = [ "physx", "physx-sys", "glam", "nphysics3d" ]
|
other-backends = [ "physx", "physx-sys", "glam", "nphysics3d" ]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nalgebra = { version = "0.26", features = [ "rand" ] }
|
nalgebra = { version = "0.27", features = [ "rand" ] }
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
rand_pcg = "0.3"
|
rand_pcg = "0.3"
|
||||||
instant = { version = "0.1", features = [ "web-sys", "now" ]}
|
instant = { version = "0.1", features = [ "web-sys", "now" ]}
|
||||||
bitflags = "1"
|
bitflags = "1"
|
||||||
glam = { version = "0.12", optional = true }
|
glam = { version = "0.12", optional = true }
|
||||||
num_cpus = { version = "1", optional = true }
|
num_cpus = { version = "1", optional = true }
|
||||||
parry3d = "0.4"
|
parry3d = "0.5"
|
||||||
ncollide3d = "0.29"
|
ncollide3d = "0.30"
|
||||||
nphysics3d = { version = "0.21", optional = true }
|
nphysics3d = { version = "0.22", optional = true }
|
||||||
physx = { version = "0.11", optional = true }
|
physx = { version = "0.11", optional = true }
|
||||||
physx-sys = { version = "0.4", optional = true }
|
physx-sys = { version = "0.4", optional = true }
|
||||||
crossbeam = "0.8"
|
crossbeam = "0.8"
|
||||||
@@ -43,8 +43,7 @@ md5 = "0.7"
|
|||||||
Inflector = "0.11"
|
Inflector = "0.11"
|
||||||
serde = { version = "1", features = [ "derive" ] }
|
serde = { version = "1", features = [ "derive" ] }
|
||||||
|
|
||||||
bevy_egui = "0.4"
|
bevy_egui = "0.5"
|
||||||
bevy-orbit-controls = "2"
|
|
||||||
|
|
||||||
# Dependencies for native only.
|
# Dependencies for native only.
|
||||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ enhanced-determinism = [ "rapier2d/enhanced-determinism" ]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
Inflector = "0.11"
|
Inflector = "0.11"
|
||||||
nalgebra = "0.26"
|
nalgebra = "0.27"
|
||||||
lyon = "0.17"
|
lyon = "0.17"
|
||||||
usvg = "0.13"
|
usvg = "0.13"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -12,13 +10,13 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Callback that will be executed on the main loop to handle proximities.
|
// Callback that will be executed on the main loop to handle proximities.
|
||||||
testbed.add_callback(move |mut graphics, physics, _, _| {
|
testbed.add_callback(move |mut graphics, physics, _, _| {
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 10.0)
|
.translation(vector![0.0, 10.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = physics.bodies.insert(rigid_body);
|
let handle = physics.bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
physics
|
physics
|
||||||
.colliders
|
.colliders
|
||||||
.insert(collider, handle, &mut physics.bodies);
|
.insert_with_parent(collider, handle, &mut physics.bodies);
|
||||||
|
|
||||||
if let Some(graphics) = &mut graphics {
|
if let Some(graphics) = &mut graphics {
|
||||||
graphics.add_body(handle, &physics.bodies, &physics.colliders);
|
graphics.add_body(handle, &physics.bodies, &physics.colliders);
|
||||||
@@ -48,5 +46,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 0.0), 20.0);
|
testbed.look_at(point![0.0, 0.0], 20.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Isometry2, Point2, Point3};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet, SharedShape};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -21,23 +19,24 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_thickness).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_thickness).build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
let collider = ColliderBuilder::cuboid(ground_thickness, ground_size)
|
let collider = ColliderBuilder::cuboid(ground_thickness, ground_size)
|
||||||
.translation(-3.0, 0.0)
|
.translation(vector![-3.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
let collider = ColliderBuilder::cuboid(ground_thickness, ground_size)
|
let collider = ColliderBuilder::cuboid(ground_thickness, ground_size)
|
||||||
.translation(6.0, 0.0)
|
.translation(vector![6.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
let collider = ColliderBuilder::cuboid(ground_thickness, ground_size)
|
let collider = ColliderBuilder::cuboid(ground_thickness, ground_size)
|
||||||
.translation(2.5, 0.0)
|
.translation(vector![2.5, 0.0])
|
||||||
.sensor(true)
|
.sensor(true)
|
||||||
|
.active_events(ActiveEvents::INTERSECTION_EVENTS)
|
||||||
.build();
|
.build();
|
||||||
let sensor_handle = colliders.insert(collider, ground_handle, &mut bodies);
|
let sensor_handle = colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the shapes
|
* Create the shapes
|
||||||
@@ -45,9 +44,9 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let radx = 0.4;
|
let radx = 0.4;
|
||||||
let rady = 0.05;
|
let rady = 0.05;
|
||||||
|
|
||||||
let delta1 = Isometry2::translation(0.0, radx - rady);
|
let delta1 = Isometry::translation(0.0, radx - rady);
|
||||||
let delta2 = Isometry2::translation(-radx + rady, 0.0);
|
let delta2 = Isometry::translation(-radx + rady, 0.0);
|
||||||
let delta3 = Isometry2::translation(radx - rady, 0.0);
|
let delta3 = Isometry::translation(radx - rady, 0.0);
|
||||||
|
|
||||||
let mut compound_parts = Vec::new();
|
let mut compound_parts = Vec::new();
|
||||||
let vertical = SharedShape::cuboid(rady, radx);
|
let vertical = SharedShape::cuboid(rady, radx);
|
||||||
@@ -70,8 +69,8 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(x, y)
|
.translation(vector![x, y])
|
||||||
.linvel(100.0, -10.0)
|
.linvel(vector![100.0, -10.0])
|
||||||
.ccd_enabled(true)
|
.ccd_enabled(true)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
@@ -80,12 +79,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// let collider = ColliderBuilder::new(part.1.clone())
|
// let collider = ColliderBuilder::new(part.1.clone())
|
||||||
// .position_wrt_parent(part.0)
|
// .position_wrt_parent(part.0)
|
||||||
// .build();
|
// .build();
|
||||||
// colliders.insert(collider, handle, &mut bodies);
|
// colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
let collider = ColliderBuilder::new(compound_shape.clone()).build();
|
let collider = ColliderBuilder::new(compound_shape.clone()).build();
|
||||||
// let collider = ColliderBuilder::cuboid(radx, rady).build();
|
// let collider = ColliderBuilder::cuboid(radx, rady).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,13 +92,23 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
testbed.add_callback(move |mut graphics, physics, events, _| {
|
testbed.add_callback(move |mut graphics, physics, events, _| {
|
||||||
while let Ok(prox) = events.intersection_events.try_recv() {
|
while let Ok(prox) = events.intersection_events.try_recv() {
|
||||||
let color = if prox.intersecting {
|
let color = if prox.intersecting {
|
||||||
Point3::new(1.0, 1.0, 0.0)
|
[1.0, 1.0, 0.0]
|
||||||
} else {
|
} else {
|
||||||
Point3::new(0.5, 0.5, 1.0)
|
[0.5, 0.5, 1.0]
|
||||||
};
|
};
|
||||||
|
|
||||||
let parent_handle1 = physics.colliders.get(prox.collider1).unwrap().parent();
|
let parent_handle1 = physics
|
||||||
let parent_handle2 = physics.colliders.get(prox.collider2).unwrap().parent();
|
.colliders
|
||||||
|
.get(prox.collider1)
|
||||||
|
.unwrap()
|
||||||
|
.parent()
|
||||||
|
.unwrap();
|
||||||
|
let parent_handle2 = physics
|
||||||
|
.colliders
|
||||||
|
.get(prox.collider2)
|
||||||
|
.unwrap()
|
||||||
|
.parent()
|
||||||
|
.unwrap();
|
||||||
if let Some(graphics) = &mut graphics {
|
if let Some(graphics) = &mut graphics {
|
||||||
if parent_handle1 != ground_handle && prox.collider1 != sensor_handle {
|
if parent_handle1 != ground_handle && prox.collider1 != sensor_handle {
|
||||||
graphics.set_body_color(parent_handle1, color);
|
graphics.set_body_color(parent_handle1, color);
|
||||||
@@ -115,5 +124,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 2.5), 20.0);
|
testbed.look_at(point![0.0, 2.5], 20.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point2, Point3};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet, InteractionGroups};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height)
|
.translation(vector![0.0, -ground_height])
|
||||||
.build();
|
.build();
|
||||||
let floor_handle = bodies.insert(rigid_body);
|
let floor_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height).build();
|
||||||
colliders.insert(collider, floor_handle, &mut bodies);
|
colliders.insert_with_parent(collider, floor_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup groups
|
* Setup groups
|
||||||
@@ -34,23 +32,24 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* A green floor that will collide with the GREEN group only.
|
* A green floor that will collide with the GREEN group only.
|
||||||
*/
|
*/
|
||||||
let green_floor = ColliderBuilder::cuboid(1.0, 0.1)
|
let green_floor = ColliderBuilder::cuboid(1.0, 0.1)
|
||||||
.translation(0.0, 1.0)
|
.translation(vector![0.0, 1.0])
|
||||||
.collision_groups(GREEN_GROUP)
|
.collision_groups(GREEN_GROUP)
|
||||||
.build();
|
.build();
|
||||||
let green_collider_handle = colliders.insert(green_floor, floor_handle, &mut bodies);
|
let green_collider_handle =
|
||||||
|
colliders.insert_with_parent(green_floor, floor_handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_initial_collider_color(green_collider_handle, Point3::new(0.0, 1.0, 0.0));
|
testbed.set_initial_collider_color(green_collider_handle, [0.0, 1.0, 0.0]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A blue floor that will collide with the BLUE group only.
|
* A blue floor that will collide with the BLUE group only.
|
||||||
*/
|
*/
|
||||||
let blue_floor = ColliderBuilder::cuboid(1.0, 0.1)
|
let blue_floor = ColliderBuilder::cuboid(1.0, 0.1)
|
||||||
.translation(0.0, 2.0)
|
.translation(vector![0.0, 2.0])
|
||||||
.collision_groups(BLUE_GROUP)
|
.collision_groups(BLUE_GROUP)
|
||||||
.build();
|
.build();
|
||||||
let blue_collider_handle = colliders.insert(blue_floor, floor_handle, &mut bodies);
|
let blue_collider_handle = colliders.insert_with_parent(blue_floor, floor_handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_initial_collider_color(blue_collider_handle, Point3::new(0.0, 0.0, 1.0));
|
testbed.set_initial_collider_color(blue_collider_handle, [0.0, 0.0, 1.0]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -69,17 +68,19 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Alternate between the green and blue groups.
|
// Alternate between the green and blue groups.
|
||||||
let (group, color) = if i % 2 == 0 {
|
let (group, color) = if i % 2 == 0 {
|
||||||
(GREEN_GROUP, Point3::new(0.0, 1.0, 0.0))
|
(GREEN_GROUP, [0.0, 1.0, 0.0])
|
||||||
} else {
|
} else {
|
||||||
(BLUE_GROUP, Point3::new(0.0, 0.0, 1.0))
|
(BLUE_GROUP, [0.0, 0.0, 1.0])
|
||||||
};
|
};
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad)
|
let collider = ColliderBuilder::cuboid(rad, rad)
|
||||||
.collision_groups(group)
|
.collision_groups(group)
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_initial_body_color(handle, color);
|
testbed.set_initial_body_color(handle, color);
|
||||||
}
|
}
|
||||||
@@ -89,5 +90,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 1.0), 100.0);
|
testbed.look_at(point![0.0, 1.0], 100.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
use na::Point2;
|
|
||||||
use rand::distributions::{Distribution, Standard};
|
use rand::distributions::{Distribution, Standard};
|
||||||
use rand::{rngs::StdRng, SeedableRng};
|
use rand::{rngs::StdRng, SeedableRng};
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -21,23 +19,23 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.rotation(std::f32::consts::FRAC_PI_2)
|
.rotation(std::f32::consts::FRAC_PI_2)
|
||||||
.translation(ground_size, ground_size * 2.0)
|
.translation(vector![ground_size, ground_size * 2.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.rotation(std::f32::consts::FRAC_PI_2)
|
.rotation(std::f32::consts::FRAC_PI_2)
|
||||||
.translation(-ground_size, ground_size * 2.0)
|
.translation(vector![-ground_size, ground_size * 2.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size * 2.0, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the convex polygons
|
* Create the convex polygons
|
||||||
@@ -58,18 +56,20 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let x = i as f32 * shift - centerx;
|
let x = i as f32 * shift - centerx;
|
||||||
let y = j as f32 * shift * 2.0 + centery + 2.0;
|
let y = j as f32 * shift * 2.0 + centery + 2.0;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let mut points = Vec::new();
|
let mut points = Vec::new();
|
||||||
|
|
||||||
for _ in 0..10 {
|
for _ in 0..10 {
|
||||||
let pt: Point2<f32> = distribution.sample(&mut rng);
|
let pt: Point<f32> = distribution.sample(&mut rng);
|
||||||
points.push(pt * scale);
|
points.push(pt * scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
let collider = ColliderBuilder::convex_hull(&points).unwrap().build();
|
let collider = ColliderBuilder::convex_hull(&points).unwrap().build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,5 +77,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 50.0), 10.0);
|
testbed.look_at(point![0.0, 50.0], 10.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point2, Vector2};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -24,8 +22,8 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rb = RigidBodyBuilder::new_dynamic()
|
let rb = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(x, y)
|
.translation(vector![x, y])
|
||||||
.linvel(x * 10.0, y * 10.0)
|
.linvel(vector![x * 10.0, y * 10.0])
|
||||||
.angvel(100.0)
|
.angvel(100.0)
|
||||||
.linear_damping((i + 1) as f32 * subdiv * 10.0)
|
.linear_damping((i + 1) as f32 * subdiv * 10.0)
|
||||||
.angular_damping((num - i) as f32 * subdiv * 10.0)
|
.angular_damping((num - i) as f32 * subdiv * 10.0)
|
||||||
@@ -34,12 +32,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Build the collider.
|
// Build the collider.
|
||||||
let co = ColliderBuilder::cuboid(rad, rad).build();
|
let co = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(co, rb_handle, &mut bodies);
|
colliders.insert_with_parent(co, rb_handle, &mut bodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world_with_params(bodies, colliders, joints, Vector2::zeros(), ());
|
testbed.set_world_with_params(bodies, colliders, joints, Vector::zeros(), ());
|
||||||
testbed.look_at(Point2::new(3.0, 2.0), 50.0);
|
testbed.look_at(point![3.0, 2.0], 50.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -16,25 +14,25 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
*/
|
*/
|
||||||
let rad = 1.0;
|
let rad = 1.0;
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -rad)
|
.translation(vector![0.0, -rad])
|
||||||
.rotation(std::f32::consts::PI / 4.0)
|
.rotation(std::f32::consts::PI / 4.0)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
// Build the dynamic box rigid body.
|
// Build the dynamic box rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 3.0 * rad)
|
.translation(vector![0.0, 3.0 * rad])
|
||||||
.can_sleep(false)
|
.can_sleep(false)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 0.0), 50.0);
|
testbed.look_at(point![0.0, 0.0], 50.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use na::{DVector, Point2, Vector2};
|
use na::DVector;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -14,7 +13,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
/*
|
/*
|
||||||
* Ground
|
* Ground
|
||||||
*/
|
*/
|
||||||
let ground_size = Vector2::new(50.0, 1.0);
|
let ground_size = Vector::new(50.0, 1.0);
|
||||||
let nsubdivs = 2000;
|
let nsubdivs = 2000;
|
||||||
|
|
||||||
let heights = DVector::from_fn(nsubdivs + 1, |i, _| {
|
let heights = DVector::from_fn(nsubdivs + 1, |i, _| {
|
||||||
@@ -28,7 +27,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::heightfield(heights, ground_size).build();
|
let collider = ColliderBuilder::heightfield(heights, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -46,15 +45,17 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let y = j as f32 * shift + centery + 3.0;
|
let y = j as f32 * shift + centery + 3.0;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
if j % 2 == 0 {
|
if j % 2 == 0 {
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
} else {
|
} else {
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,5 +64,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 0.0), 10.0);
|
testbed.look_at(point![0.0, 0.0], 10.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{BallJoint, JointSet, RigidBodyBuilder, RigidBodySet, RigidBodyType};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -15,7 +13,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Create the balls
|
* Create the balls
|
||||||
*/
|
*/
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
// NOTE: a smaller radius (e.g. 0.1) breaks Box2D so
|
// NOTE: a smaller radius (e.g. 0.1) breaks Box2D so
|
||||||
// in order to be able to compare rapier with Box2D,
|
// in order to be able to compare rapier with Box2D,
|
||||||
// we set it to 0.4.
|
// we set it to 0.4.
|
||||||
let rad = 0.4;
|
let rad = 0.4;
|
||||||
@@ -37,16 +35,16 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new(status)
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
.translation(fk * shift, -fi * shift)
|
.translation(vector![fk * shift, -fi * shift])
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, &mut bodies);
|
colliders.insert_with_parent(collider, child_handle, &mut bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
let parent_handle = *body_handles.last().unwrap();
|
let parent_handle = *body_handles.last().unwrap();
|
||||||
let joint = BallJoint::new(Point2::origin(), Point2::new(0.0, shift));
|
let joint = BallJoint::new(Point::origin(), point![0.0, shift]);
|
||||||
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,7 +52,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
if k > 0 {
|
if k > 0 {
|
||||||
let parent_index = body_handles.len() - numi;
|
let parent_index = body_handles.len() - numi;
|
||||||
let parent_handle = body_handles[parent_index];
|
let parent_handle = body_handles[parent_index];
|
||||||
let joint = BallJoint::new(Point2::origin(), Point2::new(-shift, 0.0));
|
let joint = BallJoint::new(Point::origin(), point![-shift, 0.0]);
|
||||||
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
joints.insert(&mut bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,5 +64,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(numk as f32 * rad, numi as f32 * -rad), 20.0);
|
testbed.look_at(point![numk as f32 * rad, numi as f32 * -rad], 20.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
// This shows a bug when a cylinder is in contact with a very large
|
// This shows a bug when a cylinder is in contact with a very large
|
||||||
@@ -21,38 +19,38 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height)
|
.translation(vector![0.0, -ground_height])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A rectangle that only rotate.
|
* A rectangle that only rotate.
|
||||||
*/
|
*/
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 3.0)
|
.translation(vector![0.0, 3.0])
|
||||||
.lock_translations()
|
.lock_translations()
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(2.0, 0.6).build();
|
let collider = ColliderBuilder::cuboid(2.0, 0.6).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A tilted capsule that cannot rotate.
|
* A tilted capsule that cannot rotate.
|
||||||
*/
|
*/
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 5.0)
|
.translation(vector![0.0, 5.0])
|
||||||
.rotation(1.0)
|
.rotation(1.0)
|
||||||
.lock_rotations()
|
.lock_rotations()
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::capsule_y(0.6, 0.4).build();
|
let collider = ColliderBuilder::capsule_y(0.6, 0.4).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 0.0), 40.0);
|
testbed.look_at(point![0.0, 0.0], 40.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
use na::{Point2, Vector2};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderHandle, ColliderSet};
|
|
||||||
use rapier2d::pipeline::{ContactModificationContext, PhysicsHooks, PhysicsHooksFlags};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
struct OneWayPlatformHook {
|
struct OneWayPlatformHook {
|
||||||
@@ -10,10 +7,6 @@ struct OneWayPlatformHook {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl PhysicsHooks<RigidBodySet, ColliderSet> for OneWayPlatformHook {
|
impl PhysicsHooks<RigidBodySet, ColliderSet> for OneWayPlatformHook {
|
||||||
fn active_hooks(&self) -> PhysicsHooksFlags {
|
|
||||||
PhysicsHooksFlags::MODIFY_SOLVER_CONTACTS
|
|
||||||
}
|
|
||||||
|
|
||||||
fn modify_solver_contacts(
|
fn modify_solver_contacts(
|
||||||
&self,
|
&self,
|
||||||
context: &mut ContactModificationContext<RigidBodySet, ColliderSet>,
|
context: &mut ContactModificationContext<RigidBodySet, ColliderSet>,
|
||||||
@@ -30,20 +23,20 @@ impl PhysicsHooks<RigidBodySet, ColliderSet> for OneWayPlatformHook {
|
|||||||
// - If context.collider_handle2 == self.platform1 then the allowed normal is -y.
|
// - If context.collider_handle2 == self.platform1 then the allowed normal is -y.
|
||||||
// - If context.collider_handle1 == self.platform2 then its allowed normal +y needs to be flipped to -y.
|
// - If context.collider_handle1 == self.platform2 then its allowed normal +y needs to be flipped to -y.
|
||||||
// - If context.collider_handle2 == self.platform2 then the allowed normal -y needs to be flipped to +y.
|
// - If context.collider_handle2 == self.platform2 then the allowed normal -y needs to be flipped to +y.
|
||||||
let mut allowed_local_n1 = Vector2::zeros();
|
let mut allowed_local_n1 = Vector::zeros();
|
||||||
|
|
||||||
if context.collider1 == self.platform1 {
|
if context.collider1 == self.platform1 {
|
||||||
allowed_local_n1 = Vector2::y();
|
allowed_local_n1 = Vector::y();
|
||||||
} else if context.collider2 == self.platform1 {
|
} else if context.collider2 == self.platform1 {
|
||||||
// Flip the allowed direction.
|
// Flip the allowed direction.
|
||||||
allowed_local_n1 = -Vector2::y();
|
allowed_local_n1 = -Vector::y();
|
||||||
}
|
}
|
||||||
|
|
||||||
if context.collider1 == self.platform2 {
|
if context.collider1 == self.platform2 {
|
||||||
allowed_local_n1 = -Vector2::y();
|
allowed_local_n1 = -Vector::y();
|
||||||
} else if context.collider2 == self.platform2 {
|
} else if context.collider2 == self.platform2 {
|
||||||
// Flip the allowed direction.
|
// Flip the allowed direction.
|
||||||
allowed_local_n1 = Vector2::y();
|
allowed_local_n1 = Vector::y();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the helper function that simulates one-way platforms.
|
// Call the helper function that simulates one-way platforms.
|
||||||
@@ -78,15 +71,15 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let collider = ColliderBuilder::cuboid(25.0, 0.5)
|
let collider = ColliderBuilder::cuboid(25.0, 0.5)
|
||||||
.translation(30.0, 2.0)
|
.translation(vector![30.0, 2.0])
|
||||||
.modify_solver_contacts(true)
|
.active_hooks(ActiveHooks::MODIFY_SOLVER_CONTACTS)
|
||||||
.build();
|
.build();
|
||||||
let platform1 = colliders.insert(collider, handle, &mut bodies);
|
let platform1 = colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
let collider = ColliderBuilder::cuboid(25.0, 0.5)
|
let collider = ColliderBuilder::cuboid(25.0, 0.5)
|
||||||
.translation(-30.0, -2.0)
|
.translation(vector![-30.0, -2.0])
|
||||||
.modify_solver_contacts(true)
|
.active_hooks(ActiveHooks::MODIFY_SOLVER_CONTACTS)
|
||||||
.build();
|
.build();
|
||||||
let platform2 = colliders.insert(collider, handle, &mut bodies);
|
let platform2 = colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the one-way platform hook.
|
* Setup the one-way platform hook.
|
||||||
@@ -105,12 +98,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Spawn a new cube.
|
// Spawn a new cube.
|
||||||
let collider = ColliderBuilder::cuboid(1.5, 2.0).build();
|
let collider = ColliderBuilder::cuboid(1.5, 2.0).build();
|
||||||
let body = RigidBodyBuilder::new_dynamic()
|
let body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(20.0, 10.0)
|
.translation(vector![20.0, 10.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = physics.bodies.insert(body);
|
let handle = physics.bodies.insert(body);
|
||||||
physics
|
physics
|
||||||
.colliders
|
.colliders
|
||||||
.insert(collider, handle, &mut physics.bodies);
|
.insert_with_parent(collider, handle, &mut physics.bodies);
|
||||||
|
|
||||||
if let Some(graphics) = graphics {
|
if let Some(graphics) = graphics {
|
||||||
graphics.add_body(handle, &physics.bodies, &physics.colliders);
|
graphics.add_body(handle, &physics.bodies, &physics.colliders);
|
||||||
@@ -134,8 +127,8 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
bodies,
|
bodies,
|
||||||
colliders,
|
colliders,
|
||||||
joints,
|
joints,
|
||||||
Vector2::new(0.0, -9.81),
|
vector![0.0, -9.81],
|
||||||
physics_hooks,
|
physics_hooks,
|
||||||
);
|
);
|
||||||
testbed.look_at(Point2::new(0.0, 0.0), 20.0);
|
testbed.look_at(point![0.0, 0.0], 20.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height)
|
.translation(vector![0.0, -ground_height])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the boxes
|
* Create the boxes
|
||||||
@@ -40,47 +38,57 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let y = j as f32 * shift + centery;
|
let y = j as f32 * shift + centery;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup a kinematic rigid body.
|
* Setup a position-based kinematic rigid body.
|
||||||
*/
|
*/
|
||||||
let platform_body = RigidBodyBuilder::new_kinematic()
|
let platform_body = RigidBodyBuilder::new_kinematic_velocity_based()
|
||||||
.translation(-10.0 * rad, 1.5 + 0.8)
|
.translation(vector![-10.0 * rad, 1.5 + 0.8])
|
||||||
.build();
|
.build();
|
||||||
let platform_handle = bodies.insert(platform_body);
|
let velocity_based_platform_handle = bodies.insert(platform_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad * 10.0, rad).build();
|
let collider = ColliderBuilder::cuboid(rad * 10.0, rad).build();
|
||||||
colliders.insert(collider, platform_handle, &mut bodies);
|
colliders.insert_with_parent(collider, velocity_based_platform_handle, &mut bodies);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup a velocity-based kinematic rigid body.
|
||||||
|
*/
|
||||||
|
let platform_body = RigidBodyBuilder::new_kinematic_position_based()
|
||||||
|
.translation(vector![-10.0 * rad, 2.0 + 1.5 + 0.8])
|
||||||
|
.build();
|
||||||
|
let position_based_platform_handle = bodies.insert(platform_body);
|
||||||
|
let collider = ColliderBuilder::cuboid(rad * 10.0, rad).build();
|
||||||
|
colliders.insert_with_parent(collider, position_based_platform_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup a callback to control the platform.
|
* Setup a callback to control the platform.
|
||||||
*/
|
*/
|
||||||
testbed.add_callback(move |_, physics, _, run_state| {
|
testbed.add_callback(move |_, physics, _, run_state| {
|
||||||
let platform = physics.bodies.get_mut(platform_handle).unwrap();
|
let velocity = vector![run_state.time.sin() * 5.0, (run_state.time * 5.0).sin()];
|
||||||
let mut next_pos = *platform.position();
|
|
||||||
|
|
||||||
let dt = 0.016;
|
// Update the velocity-based kinematic body by setting its velocity.
|
||||||
next_pos.translation.vector.y += (run_state.time * 5.0).sin() * dt;
|
if let Some(platform) = physics.bodies.get_mut(velocity_based_platform_handle) {
|
||||||
next_pos.translation.vector.x += run_state.time.sin() * 5.0 * dt;
|
platform.set_linvel(velocity, true);
|
||||||
|
|
||||||
if next_pos.translation.vector.x >= rad * 10.0 {
|
|
||||||
next_pos.translation.vector.x -= dt;
|
|
||||||
}
|
|
||||||
if next_pos.translation.vector.x <= -rad * 10.0 {
|
|
||||||
next_pos.translation.vector.x += dt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
platform.set_next_kinematic_position(next_pos);
|
// Update the position-based kinematic body by setting its next position.
|
||||||
|
if let Some(platform) = physics.bodies.get_mut(position_based_platform_handle) {
|
||||||
|
let mut next_tra = *platform.translation();
|
||||||
|
next_tra += velocity * physics.integration_parameters.dt;
|
||||||
|
platform.set_next_kinematic_translation(next_tra);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Run the simulation.
|
* Run the simulation.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 1.0), 40.0);
|
testbed.look_at(point![0.0, 1.0], 40.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use na::{ComplexField, Point2};
|
use na::ComplexField;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -19,18 +18,18 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let step_size = ground_size / (nsubdivs as f32);
|
let step_size = ground_size / (nsubdivs as f32);
|
||||||
let mut points = Vec::new();
|
let mut points = Vec::new();
|
||||||
|
|
||||||
points.push(Point2::new(-ground_size / 2.0, 40.0));
|
points.push(point![-ground_size / 2.0, 40.0]);
|
||||||
for i in 1..nsubdivs - 1 {
|
for i in 1..nsubdivs - 1 {
|
||||||
let x = -ground_size / 2.0 + i as f32 * step_size;
|
let x = -ground_size / 2.0 + i as f32 * step_size;
|
||||||
let y = ComplexField::cos(i as f32 * step_size) * 2.0;
|
let y = ComplexField::cos(i as f32 * step_size) * 2.0;
|
||||||
points.push(Point2::new(x, y));
|
points.push(point![x, y]);
|
||||||
}
|
}
|
||||||
points.push(Point2::new(ground_size / 2.0, 40.0));
|
points.push(point![ground_size / 2.0, 40.0]);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::polyline(points, None).build();
|
let collider = ColliderBuilder::polyline(points, None).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -48,15 +47,17 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let y = j as f32 * shift + centery + 3.0;
|
let y = j as f32 * shift + centery + 3.0;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
if j % 2 == 0 {
|
if j % 2 == 0 {
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
} else {
|
} else {
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -65,5 +66,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 0.0), 10.0);
|
testbed.look_at(point![0.0, 0.0], 10.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -20,7 +18,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_thickness).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_thickness).build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -40,10 +38,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let y = fi * shift + centery;
|
let y = fi * shift + centery;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,5 +51,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 2.5), 20.0);
|
testbed.look_at(point![0.0, 2.5], 20.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,13 +16,13 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 1.0;
|
let ground_height = 1.0;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height)
|
.translation(vector![0.0, -ground_height])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height)
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height)
|
||||||
.restitution(1.0)
|
.restitution(1.0)
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let num = 10;
|
let num = 10;
|
||||||
let rad = 0.5;
|
let rad = 0.5;
|
||||||
@@ -33,13 +31,13 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
for i in 0..=num {
|
for i in 0..=num {
|
||||||
let x = (i as f32) - num as f32 / 2.0;
|
let x = (i as f32) - num as f32 / 2.0;
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(x * 2.0, 10.0 * (j as f32 + 1.0))
|
.translation(vector![x * 2.0, 10.0 * (j as f32 + 1.0)])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad)
|
let collider = ColliderBuilder::ball(rad)
|
||||||
.restitution((i as f32) / (num as f32))
|
.restitution((i as f32) / (num as f32))
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,5 +45,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 1.0), 25.0);
|
testbed.look_at(point![0.0, 1.0], 25.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point2, Point3};
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height)
|
.translation(vector![0.0, -ground_height])
|
||||||
.build();
|
.build();
|
||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height).build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create some boxes.
|
* Create some boxes.
|
||||||
@@ -38,12 +36,14 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let y = 3.0;
|
let y = 3.0;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_initial_body_color(handle, Point3::new(0.5, 0.5, 1.0));
|
testbed.set_initial_body_color(handle, [0.5, 0.5, 1.0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -52,33 +52,38 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Rigid body so that the sensor can move.
|
// Rigid body so that the sensor can move.
|
||||||
let sensor = RigidBodyBuilder::new_dynamic()
|
let sensor = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 10.0)
|
.translation(vector![0.0, 10.0])
|
||||||
.build();
|
.build();
|
||||||
let sensor_handle = bodies.insert(sensor);
|
let sensor_handle = bodies.insert(sensor);
|
||||||
|
|
||||||
// Solid cube attached to the sensor which
|
// Solid cube attached to the sensor which
|
||||||
// other colliders can touch.
|
// other colliders can touch.
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad).build();
|
||||||
colliders.insert(collider, sensor_handle, &mut bodies);
|
colliders.insert_with_parent(collider, sensor_handle, &mut bodies);
|
||||||
|
|
||||||
// We create a collider desc without density because we don't
|
// We create a collider desc without density because we don't
|
||||||
// want it to contribute to the rigid body mass.
|
// want it to contribute to the rigid body mass.
|
||||||
let sensor_collider = ColliderBuilder::ball(rad * 5.0).sensor(true).build();
|
let sensor_collider = ColliderBuilder::ball(rad * 5.0)
|
||||||
colliders.insert(sensor_collider, sensor_handle, &mut bodies);
|
.density(0.0)
|
||||||
|
.sensor(true)
|
||||||
|
.active_events(ActiveEvents::INTERSECTION_EVENTS)
|
||||||
|
.build();
|
||||||
|
colliders.insert_with_parent(sensor_collider, sensor_handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_initial_body_color(sensor_handle, Point3::new(0.5, 1.0, 1.0));
|
testbed.set_initial_body_color(sensor_handle, [0.5, 1.0, 1.0]);
|
||||||
|
|
||||||
// Callback that will be executed on the main loop to handle proximities.
|
// Callback that will be executed on the main loop to handle proximities.
|
||||||
testbed.add_callback(move |mut graphics, physics, events, _| {
|
testbed.add_callback(move |mut graphics, physics, events, _| {
|
||||||
while let Ok(prox) = events.intersection_events.try_recv() {
|
while let Ok(prox) = events.intersection_events.try_recv() {
|
||||||
let color = if prox.intersecting {
|
let color = if prox.intersecting {
|
||||||
Point3::new(1.0, 1.0, 0.0)
|
[1.0, 1.0, 0.0]
|
||||||
} else {
|
} else {
|
||||||
Point3::new(0.5, 0.5, 1.0)
|
[0.5, 0.5, 1.0]
|
||||||
};
|
};
|
||||||
|
|
||||||
let parent_handle1 = physics.colliders.get(prox.collider1).unwrap().parent();
|
let parent_handle1 = physics.colliders[prox.collider1].parent().unwrap();
|
||||||
let parent_handle2 = physics.colliders.get(prox.collider2).unwrap().parent();
|
let parent_handle2 = physics.colliders[prox.collider2].parent().unwrap();
|
||||||
|
|
||||||
if let Some(graphics) = &mut graphics {
|
if let Some(graphics) = &mut graphics {
|
||||||
if parent_handle1 != ground_handle && parent_handle1 != sensor_handle {
|
if parent_handle1 != ground_handle && parent_handle1 != sensor_handle {
|
||||||
graphics.set_body_color(parent_handle1, color);
|
graphics.set_body_color(parent_handle1, color);
|
||||||
@@ -94,5 +99,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 1.0), 100.0);
|
testbed.look_at(point![0.0, 1.0], 100.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point2;
|
use rapier2d::prelude::*;
|
||||||
use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier2d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed2d::Testbed;
|
use rapier_testbed2d::Testbed;
|
||||||
|
|
||||||
use lyon::math::Point;
|
use lyon::math::Point;
|
||||||
@@ -25,23 +23,23 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.rotation(std::f32::consts::FRAC_PI_2)
|
.rotation(std::f32::consts::FRAC_PI_2)
|
||||||
.translation(ground_size, ground_size)
|
.translation(vector![ground_size, ground_size])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.rotation(std::f32::consts::FRAC_PI_2)
|
.rotation(std::f32::consts::FRAC_PI_2)
|
||||||
.translation(-ground_size, ground_size)
|
.translation(vector![-ground_size, ground_size])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
let collider = ColliderBuilder::cuboid(ground_size, 1.2).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the trimeshes from a tesselated SVG.
|
* Create the trimeshes from a tesselated SVG.
|
||||||
@@ -83,18 +81,18 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let vertices: Vec<_> = mesh
|
let vertices: Vec<_> = mesh
|
||||||
.vertices
|
.vertices
|
||||||
.iter()
|
.iter()
|
||||||
.map(|v| Point2::new(v.position[0] * sx, v.position[1] * -sy))
|
.map(|v| point![v.position[0] * sx, v.position[1] * -sy])
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
for k in 0..5 {
|
for k in 0..5 {
|
||||||
let collider =
|
let collider =
|
||||||
ColliderBuilder::trimesh(vertices.clone(), indices.clone()).build();
|
ColliderBuilder::trimesh(vertices.clone(), indices.clone()).build();
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(ith as f32 * 8.0 - 20.0, 20.0 + k as f32 * 11.0)
|
.translation(vector![ith as f32 * 8.0 - 20.0, 20.0 + k as f32 * 11.0])
|
||||||
.rotation(angle)
|
.rotation(angle)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
ith += 1;
|
ith += 1;
|
||||||
@@ -106,7 +104,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point2::new(0.0, 20.0), 17.0);
|
testbed.look_at(point![0.0, 20.0], 17.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const RAPIER_SVG_STR: &'static str = r#"
|
const RAPIER_SVG_STR: &'static str = r#"
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ enhanced-determinism = [ "rapier3d/enhanced-determinism" ]
|
|||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
getrandom = { version = "0.2", features = [ "js" ] }
|
getrandom = { version = "0.2", features = [ "js" ] }
|
||||||
Inflector = "0.11"
|
Inflector = "0.11"
|
||||||
nalgebra = "0.26"
|
nalgebra = "0.27"
|
||||||
wasm-bindgen = "0.2"
|
wasm-bindgen = "0.2"
|
||||||
obj-rs = { version = "0.6", default-features = false }
|
obj-rs = { version = "0.6", default-features = false }
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
fn create_wall(
|
fn create_wall(
|
||||||
testbed: &mut Testbed,
|
testbed: &mut Testbed,
|
||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
offset: Vector3<f32>,
|
offset: Vector<f32>,
|
||||||
stack_height: usize,
|
stack_height: usize,
|
||||||
half_extents: Vector3<f32>,
|
half_extents: Vector<f32>,
|
||||||
) {
|
) {
|
||||||
let shift = half_extents * 2.0;
|
let shift = half_extents * 2.0;
|
||||||
let mut k = 0;
|
let mut k = 0;
|
||||||
@@ -23,22 +21,18 @@ fn create_wall(
|
|||||||
- stack_height as f32 * half_extents.z;
|
- stack_height as f32 * half_extents.z;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider =
|
let collider =
|
||||||
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
ColliderBuilder::cuboid(half_extents.x, half_extents.y, half_extents.z).build();
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert_with_parent(collider, handle, bodies);
|
||||||
k += 1;
|
k += 1;
|
||||||
if k % 2 == 0 {
|
if k % 2 == 0 {
|
||||||
testbed.set_initial_body_color(
|
testbed.set_initial_body_color(handle, [255. / 255., 131. / 255., 244.0 / 255.]);
|
||||||
handle,
|
|
||||||
Point3::new(255. / 255., 131. / 255., 244.0 / 255.),
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
testbed.set_initial_body_color(
|
testbed.set_initial_body_color(handle, [131. / 255., 255. / 255., 244.0 / 255.]);
|
||||||
handle,
|
|
||||||
Point3::new(131. / 255., 255. / 255., 244.0 / 255.),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -59,11 +53,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the pyramids.
|
* Create the pyramids.
|
||||||
@@ -79,18 +73,18 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
testbed,
|
testbed,
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(x, shift_y, 0.0),
|
vector![x, shift_y, 0.0],
|
||||||
num_z,
|
num_z,
|
||||||
Vector3::new(0.5, 0.5, 1.0),
|
vector![0.5, 0.5, 1.0],
|
||||||
);
|
);
|
||||||
|
|
||||||
create_wall(
|
create_wall(
|
||||||
testbed,
|
testbed,
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
Vector3::new(x, shift_y, shift_z),
|
vector![x, shift_y, shift_z],
|
||||||
num_z,
|
num_z,
|
||||||
Vector3::new(0.5, 0.5, 1.0),
|
vector![0.5, 0.5, 1.0],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,37 +96,48 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let collider = ColliderBuilder::ball(1.0)
|
let collider = ColliderBuilder::ball(1.0)
|
||||||
.density(10.0)
|
.density(10.0)
|
||||||
.sensor(true)
|
.sensor(true)
|
||||||
|
.active_events(ActiveEvents::INTERSECTION_EVENTS)
|
||||||
.build();
|
.build();
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.linvel(1000.0, 0.0, 0.0)
|
.linvel(vector![1000.0, 0.0, 0.0])
|
||||||
.translation(-20.0, shift_y + 2.0, 0.0)
|
.translation(vector![-20.0, shift_y + 2.0, 0.0])
|
||||||
.ccd_enabled(true)
|
.ccd_enabled(true)
|
||||||
.build();
|
.build();
|
||||||
let sensor_handle = bodies.insert(rigid_body);
|
let sensor_handle = bodies.insert(rigid_body);
|
||||||
colliders.insert(collider, sensor_handle, &mut bodies);
|
colliders.insert_with_parent(collider, sensor_handle, &mut bodies);
|
||||||
|
|
||||||
// Second rigid-body with CCD enabled.
|
// Second rigid-body with CCD enabled.
|
||||||
let collider = ColliderBuilder::ball(1.0).density(10.0).build();
|
let collider = ColliderBuilder::ball(1.0).density(10.0).build();
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.linvel(1000.0, 0.0, 0.0)
|
.linvel(vector![1000.0, 0.0, 0.0])
|
||||||
.translation(-20.0, shift_y + 2.0, shift_z)
|
.translation(vector![-20.0, shift_y + 2.0, shift_z])
|
||||||
.ccd_enabled(true)
|
.ccd_enabled(true)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
colliders.insert(collider.clone(), handle, &mut bodies);
|
colliders.insert_with_parent(collider.clone(), handle, &mut bodies);
|
||||||
testbed.set_initial_body_color(handle, Point3::new(0.2, 0.2, 1.0));
|
testbed.set_initial_body_color(handle, [0.2, 0.2, 1.0]);
|
||||||
|
|
||||||
// Callback that will be executed on the main loop to handle proximities.
|
// Callback that will be executed on the main loop to handle proximities.
|
||||||
testbed.add_callback(move |mut graphics, physics, events, _| {
|
testbed.add_callback(move |mut graphics, physics, events, _| {
|
||||||
while let Ok(prox) = events.intersection_events.try_recv() {
|
while let Ok(prox) = events.intersection_events.try_recv() {
|
||||||
let color = if prox.intersecting {
|
let color = if prox.intersecting {
|
||||||
Point3::new(1.0, 1.0, 0.0)
|
[1.0, 1.0, 0.0]
|
||||||
} else {
|
} else {
|
||||||
Point3::new(0.5, 0.5, 1.0)
|
[0.5, 0.5, 1.0]
|
||||||
};
|
};
|
||||||
|
|
||||||
let parent_handle1 = physics.colliders.get(prox.collider1).unwrap().parent();
|
let parent_handle1 = physics
|
||||||
let parent_handle2 = physics.colliders.get(prox.collider2).unwrap().parent();
|
.colliders
|
||||||
|
.get(prox.collider1)
|
||||||
|
.unwrap()
|
||||||
|
.parent()
|
||||||
|
.unwrap();
|
||||||
|
let parent_handle2 = physics
|
||||||
|
.colliders
|
||||||
|
.get(prox.collider2)
|
||||||
|
.unwrap()
|
||||||
|
.parent()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
if let Some(graphics) = &mut graphics {
|
if let Some(graphics) = &mut graphics {
|
||||||
if parent_handle1 != ground_handle && parent_handle1 != sensor_handle {
|
if parent_handle1 != ground_handle && parent_handle1 != sensor_handle {
|
||||||
@@ -149,5 +154,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet, InteractionGroups};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let floor_handle = bodies.insert(rigid_body);
|
let floor_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, floor_handle, &mut bodies);
|
colliders.insert_with_parent(collider, floor_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup groups
|
* Setup groups
|
||||||
@@ -34,23 +32,24 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* A green floor that will collide with the GREEN group only.
|
* A green floor that will collide with the GREEN group only.
|
||||||
*/
|
*/
|
||||||
let green_floor = ColliderBuilder::cuboid(1.0, 0.1, 1.0)
|
let green_floor = ColliderBuilder::cuboid(1.0, 0.1, 1.0)
|
||||||
.translation(0.0, 1.0, 0.0)
|
.translation(vector![0.0, 1.0, 0.0])
|
||||||
.collision_groups(GREEN_GROUP)
|
.collision_groups(GREEN_GROUP)
|
||||||
.build();
|
.build();
|
||||||
let green_collider_handle = colliders.insert(green_floor, floor_handle, &mut bodies);
|
let green_collider_handle =
|
||||||
|
colliders.insert_with_parent(green_floor, floor_handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_initial_collider_color(green_collider_handle, Point3::new(0.0, 1.0, 0.0));
|
testbed.set_initial_collider_color(green_collider_handle, [0.0, 1.0, 0.0]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A blue floor that will collide with the BLUE group only.
|
* A blue floor that will collide with the BLUE group only.
|
||||||
*/
|
*/
|
||||||
let blue_floor = ColliderBuilder::cuboid(1.0, 0.1, 1.0)
|
let blue_floor = ColliderBuilder::cuboid(1.0, 0.1, 1.0)
|
||||||
.translation(0.0, 2.0, 0.0)
|
.translation(vector![0.0, 2.0, 0.0])
|
||||||
.collision_groups(BLUE_GROUP)
|
.collision_groups(BLUE_GROUP)
|
||||||
.build();
|
.build();
|
||||||
let blue_collider_handle = colliders.insert(blue_floor, floor_handle, &mut bodies);
|
let blue_collider_handle = colliders.insert_with_parent(blue_floor, floor_handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_initial_collider_color(blue_collider_handle, Point3::new(0.0, 0.0, 1.0));
|
testbed.set_initial_collider_color(blue_collider_handle, [0.0, 0.0, 1.0]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -72,17 +71,19 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Alternate between the green and blue groups.
|
// Alternate between the green and blue groups.
|
||||||
let (group, color) = if k % 2 == 0 {
|
let (group, color) = if k % 2 == 0 {
|
||||||
(GREEN_GROUP, Point3::new(0.0, 1.0, 0.0))
|
(GREEN_GROUP, [0.0, 1.0, 0.0])
|
||||||
} else {
|
} else {
|
||||||
(BLUE_GROUP, Point3::new(0.0, 0.0, 1.0))
|
(BLUE_GROUP, [0.0, 0.0, 1.0])
|
||||||
};
|
};
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad)
|
let collider = ColliderBuilder::cuboid(rad, rad, rad)
|
||||||
.collision_groups(group)
|
.collision_groups(group)
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_initial_body_color(handle, color);
|
testbed.set_initial_body_color(handle, color);
|
||||||
}
|
}
|
||||||
@@ -93,5 +94,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
|
testbed.look_at(point!(10.0, 10.0, 10.0), Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Isometry3, Point3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet, SharedShape};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -46,40 +44,42 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shift * 2.0 - centerz + offset;
|
let z = k as f32 * shift * 2.0 - centerz + offset;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
// First option: attach several colliders to a single rigid-body.
|
// First option: attach several colliders to a single rigid-body.
|
||||||
if j < numy / 2 {
|
if j < numy / 2 {
|
||||||
let collider1 = ColliderBuilder::cuboid(rad * 10.0, rad, rad).build();
|
let collider1 = ColliderBuilder::cuboid(rad * 10.0, rad, rad).build();
|
||||||
let collider2 = ColliderBuilder::cuboid(rad, rad * 10.0, rad)
|
let collider2 = ColliderBuilder::cuboid(rad, rad * 10.0, rad)
|
||||||
.translation(rad * 10.0, rad * 10.0, 0.0)
|
.translation(vector![rad * 10.0, rad * 10.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let collider3 = ColliderBuilder::cuboid(rad, rad * 10.0, rad)
|
let collider3 = ColliderBuilder::cuboid(rad, rad * 10.0, rad)
|
||||||
.translation(-rad * 10.0, rad * 10.0, 0.0)
|
.translation(vector![-rad * 10.0, rad * 10.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider1, handle, &mut bodies);
|
colliders.insert_with_parent(collider1, handle, &mut bodies);
|
||||||
colliders.insert(collider2, handle, &mut bodies);
|
colliders.insert_with_parent(collider2, handle, &mut bodies);
|
||||||
colliders.insert(collider3, handle, &mut bodies);
|
colliders.insert_with_parent(collider3, handle, &mut bodies);
|
||||||
} else {
|
} else {
|
||||||
// Second option: create a compound shape and attach it to a single collider.
|
// Second option: create a compound shape and attach it to a single collider.
|
||||||
let shapes = vec![
|
let shapes = vec![
|
||||||
(
|
(
|
||||||
Isometry3::identity(),
|
Isometry::identity(),
|
||||||
SharedShape::cuboid(rad * 10.0, rad, rad),
|
SharedShape::cuboid(rad * 10.0, rad, rad),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
Isometry3::translation(rad * 10.0, rad * 10.0, 0.0),
|
Isometry::translation(rad * 10.0, rad * 10.0, 0.0),
|
||||||
SharedShape::cuboid(rad, rad * 10.0, rad),
|
SharedShape::cuboid(rad, rad * 10.0, rad),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
Isometry3::translation(-rad * 10.0, rad * 10.0, 0.0),
|
Isometry::translation(-rad * 10.0, rad * 10.0, 0.0),
|
||||||
SharedShape::cuboid(rad, rad * 10.0, rad),
|
SharedShape::cuboid(rad, rad * 10.0, rad),
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
let collider = ColliderBuilder::compound(shapes).build();
|
let collider = ColliderBuilder::compound(shapes).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -91,5 +91,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
use na::Point3;
|
|
||||||
use obj::raw::object::Polygon;
|
use obj::raw::object::Polygon;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet, SharedShape};
|
|
||||||
use rapier3d::parry::bounding_volume;
|
use rapier3d::parry::bounding_volume;
|
||||||
|
use rapier3d::prelude::*;
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::BufReader;
|
use std::io::BufReader;
|
||||||
@@ -26,11 +24,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the convex decompositions.
|
* Create the convex decompositions.
|
||||||
@@ -52,7 +50,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let mut vertices: Vec<_> = model
|
let mut vertices: Vec<_> = model
|
||||||
.positions
|
.positions
|
||||||
.iter()
|
.iter()
|
||||||
.map(|v| Point3::new(v.0, v.1, v.2))
|
.map(|v| point![v.0, v.1, v.2])
|
||||||
.collect();
|
.collect();
|
||||||
use std::iter::FromIterator;
|
use std::iter::FromIterator;
|
||||||
let indices: Vec<_> = model
|
let indices: Vec<_> = model
|
||||||
@@ -90,12 +88,14 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let y = (igeom / width) as f32 * shift + 4.0;
|
let y = (igeom / width) as f32 * shift + 4.0;
|
||||||
let z = k as f32 * shift;
|
let z = k as f32 * shift;
|
||||||
|
|
||||||
let body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(body);
|
let handle = bodies.insert(body);
|
||||||
|
|
||||||
for shape in &shapes {
|
for shape in &shapes {
|
||||||
let collider = ColliderBuilder::new(shape.clone()).build();
|
let collider = ColliderBuilder::new(shape.clone()).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -105,7 +105,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn models() -> Vec<String> {
|
fn models() -> Vec<String> {
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
use na::Point3;
|
|
||||||
use rand::distributions::{Distribution, Standard};
|
use rand::distributions::{Distribution, Standard};
|
||||||
use rand::{rngs::StdRng, SeedableRng};
|
use rand::{rngs::StdRng, SeedableRng};
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -20,11 +18,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the polyhedra
|
* Create the polyhedra
|
||||||
@@ -50,17 +48,19 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
let mut points = Vec::new();
|
let mut points = Vec::new();
|
||||||
for _ in 0..10 {
|
for _ in 0..10 {
|
||||||
let pt: Point3<f32> = distribution.sample(&mut rng);
|
let pt: Point<f32> = distribution.sample(&mut rng);
|
||||||
points.push(pt * scale);
|
points.push(pt * scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::round_convex_hull(&points, border_rad)
|
let collider = ColliderBuilder::round_convex_hull(&points, border_rad)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -69,5 +69,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(30.0, 30.0, 30.0), Point3::origin());
|
testbed.look_at(point![30.0, 30.0, 30.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -24,9 +22,9 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rb = RigidBodyBuilder::new_dynamic()
|
let rb = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(x, y, 0.0)
|
.translation(vector![x, y, 0.0])
|
||||||
.linvel(x * 10.0, y * 10.0, 0.0)
|
.linvel(vector![x * 10.0, y * 10.0, 0.0])
|
||||||
.angvel(Vector3::z() * 100.0)
|
.angvel(Vector::z() * 100.0)
|
||||||
.linear_damping((i + 1) as f32 * subdiv * 10.0)
|
.linear_damping((i + 1) as f32 * subdiv * 10.0)
|
||||||
.angular_damping((num - i) as f32 * subdiv * 10.0)
|
.angular_damping((num - i) as f32 * subdiv * 10.0)
|
||||||
.build();
|
.build();
|
||||||
@@ -34,12 +32,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Build the collider.
|
// Build the collider.
|
||||||
let co = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let co = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(co, rb_handle, &mut bodies);
|
colliders.insert_with_parent(co, rb_handle, &mut bodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world_with_params(bodies, colliders, joints, Vector3::zeros(), ());
|
testbed.set_world_with_params(bodies, colliders, joints, Vector::zeros(), ());
|
||||||
testbed.look_at(Point3::new(2.0, 2.5, 20.0), Point3::new(2.0, 2.5, 0.0));
|
testbed.look_at(point![2.0, 2.5, 20.0], point![2.0, 2.5, 0.0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -17,22 +15,23 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, 0.4).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, 0.4).build();
|
||||||
let mut ground_collider_handle = colliders.insert(collider, ground_handle, &mut bodies);
|
let mut ground_collider_handle =
|
||||||
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rolling ball
|
* Rolling ball
|
||||||
*/
|
*/
|
||||||
let ball_rad = 0.1;
|
let ball_rad = 0.1;
|
||||||
let rb = RigidBodyBuilder::new_dynamic()
|
let rb = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 0.2, 0.0)
|
.translation(vector![0.0, 0.2, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ball_handle = bodies.insert(rb);
|
let ball_handle = bodies.insert(rb);
|
||||||
let collider = ColliderBuilder::ball(ball_rad).density(100.0).build();
|
let collider = ColliderBuilder::ball(ball_rad).density(100.0).build();
|
||||||
colliders.insert(collider, ball_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ball_handle, &mut bodies);
|
||||||
|
|
||||||
testbed.add_callback(move |_, physics, _, _| {
|
testbed.add_callback(move |_, physics, _, _| {
|
||||||
// Remove then re-add the ground collider.
|
// Remove then re-add the ground collider.
|
||||||
@@ -46,14 +45,15 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
true,
|
true,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
ground_collider_handle = physics
|
ground_collider_handle =
|
||||||
.colliders
|
physics
|
||||||
.insert(coll, ground_handle, &mut physics.bodies);
|
.colliders
|
||||||
|
.insert_with_parent(coll, ground_handle, &mut physics.bodies);
|
||||||
});
|
});
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
|
testbed.look_at(point![10.0, 10.0, 10.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet, HalfSpace, SharedShape};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -16,9 +14,9 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
*/
|
*/
|
||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let halfspace = SharedShape::new(HalfSpace::new(Vector3::y_axis()));
|
let halfspace = SharedShape::new(HalfSpace::new(Vector::y_axis()));
|
||||||
let collider = ColliderBuilder::new(halfspace).build();
|
let collider = ColliderBuilder::new(halfspace).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let mut curr_y = 0.0;
|
let mut curr_y = 0.0;
|
||||||
let mut curr_width = 10_000.0;
|
let mut curr_width = 10_000.0;
|
||||||
@@ -28,11 +26,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
curr_y += curr_height * 4.0;
|
curr_y += curr_height * 4.0;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, curr_y, 0.0)
|
.translation(vector![0.0, curr_y, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(curr_width, curr_height, curr_width).build();
|
let collider = ColliderBuilder::cuboid(curr_width, curr_height, curr_width).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
curr_width /= 5.0;
|
curr_width /= 5.0;
|
||||||
}
|
}
|
||||||
@@ -41,5 +39,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
|
testbed.look_at(point![10.0, 10.0, 10.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -19,28 +17,28 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
for _ in 0..6 {
|
for _ in 0..6 {
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build the dynamic box rigid body.
|
// Build the dynamic box rigid body.
|
||||||
for _ in 0..6 {
|
for _ in 0..6 {
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(1.1, 0.0, 0.0)
|
.translation(vector![1.1, 0.0, 0.0])
|
||||||
.rotation(Vector3::new(0.8, 0.2, 0.1))
|
.rotation(vector![0.8, 0.2, 0.1])
|
||||||
.can_sleep(false)
|
.can_sleep(false)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(2.0, 0.1, 1.0).build();
|
let collider = ColliderBuilder::cuboid(2.0, 0.1, 1.0).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
|
testbed.look_at(point![10.0, 10.0, 10.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
// This shows a bug when a cylinder is in contact with a very large
|
// This shows a bug when a cylinder is in contact with a very large
|
||||||
@@ -21,11 +19,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -47,14 +45,16 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = -centerz + offset;
|
let z = -centerz + offset;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cylinder(rad, rad).build();
|
let collider = ColliderBuilder::cylinder(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Isometry3, Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -17,30 +15,30 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, 0.4)
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, 0.4)
|
||||||
.friction(0.15)
|
.friction(0.15)
|
||||||
// .restitution(0.5)
|
// .restitution(0.5)
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rolling ball
|
* Rolling ball
|
||||||
*/
|
*/
|
||||||
let ball_rad = 0.1;
|
let ball_rad = 0.1;
|
||||||
let rb = RigidBodyBuilder::new_dynamic()
|
let rb = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 0.2, 0.0)
|
.translation(vector![0.0, 0.2, 0.0])
|
||||||
.linvel(10.0, 0.0, 0.0)
|
.linvel(vector![10.0, 0.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ball_handle = bodies.insert(rb);
|
let ball_handle = bodies.insert(rb);
|
||||||
let collider = ColliderBuilder::ball(ball_rad).density(100.0).build();
|
let collider = ColliderBuilder::ball(ball_rad).density(100.0).build();
|
||||||
colliders.insert(collider, ball_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ball_handle, &mut bodies);
|
||||||
|
|
||||||
let mut linvel = Vector3::zeros();
|
let mut linvel = Vector::zeros();
|
||||||
let mut angvel = Vector3::zeros();
|
let mut angvel = Vector::zeros();
|
||||||
let mut pos = Isometry3::identity();
|
let mut pos = Isometry::identity();
|
||||||
let mut step = 0;
|
let mut step = 0;
|
||||||
let mut extra_colliders = Vec::new();
|
let mut extra_colliders = Vec::new();
|
||||||
let snapped_frame = 51;
|
let snapped_frame = 51;
|
||||||
@@ -55,7 +53,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let new_ball_collider_handle =
|
let new_ball_collider_handle =
|
||||||
physics
|
physics
|
||||||
.colliders
|
.colliders
|
||||||
.insert(collider, ball_handle, &mut physics.bodies);
|
.insert_with_parent(collider, ball_handle, &mut physics.bodies);
|
||||||
|
|
||||||
if let Some(graphics) = &mut graphics {
|
if let Some(graphics) = &mut graphics {
|
||||||
graphics.add_collider(new_ball_collider_handle, &physics.colliders);
|
graphics.add_collider(new_ball_collider_handle, &physics.colliders);
|
||||||
@@ -93,7 +91,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Remove then re-add the ground collider.
|
// Remove then re-add the ground collider.
|
||||||
// let ground = physics.bodies.get_mut(ground_handle).unwrap();
|
// let ground = physics.bodies.get_mut(ground_handle).unwrap();
|
||||||
// ground.set_position(Isometry3::translation(0.0, step as f32 * 0.001, 0.0), false);
|
// ground.set_position(Isometry::translation(0.0, step as f32 * 0.001, 0.0), false);
|
||||||
// let coll = physics
|
// let coll = physics
|
||||||
// .colliders
|
// .colliders
|
||||||
// .remove(ground_collider_handle, &mut physics.bodies, true)
|
// .remove(ground_collider_handle, &mut physics.bodies, true)
|
||||||
@@ -104,7 +102,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let new_ground_collider_handle =
|
let new_ground_collider_handle =
|
||||||
physics
|
physics
|
||||||
.colliders
|
.colliders
|
||||||
.insert(coll, ground_handle, &mut physics.bodies);
|
.insert_with_parent(coll, ground_handle, &mut physics.bodies);
|
||||||
|
|
||||||
if let Some(graphics) = &mut graphics {
|
if let Some(graphics) = &mut graphics {
|
||||||
graphics.add_collider(new_ground_collider_handle, &physics.colliders);
|
graphics.add_collider(new_ground_collider_handle, &physics.colliders);
|
||||||
@@ -117,5 +115,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
|
testbed.look_at(point![10.0, 10.0, 10.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -22,24 +20,24 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size)
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size)
|
||||||
.friction(1.5)
|
.friction(1.5)
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
// Build a dynamic box rigid body.
|
// Build a dynamic box rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 1.1, 0.0)
|
.translation(vector![0.0, 1.1, 0.0])
|
||||||
.rotation(Vector3::y() * 0.3)
|
.rotation(Vector::y() * 0.3)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(2.0, 1.0, 3.0).friction(1.5).build();
|
let collider = ColliderBuilder::cuboid(2.0, 1.0, 3.0).friction(1.5).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = &mut bodies[handle];
|
let rigid_body = &mut bodies[handle];
|
||||||
let force = rigid_body.position() * Vector3::z() * 50.0;
|
let force = rigid_body.position() * Vector::z() * 50.0;
|
||||||
rigid_body.set_linvel(force, true);
|
rigid_body.set_linvel(force, true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,33 +16,33 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 2.1;
|
let ground_height = 2.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, 4.0, 0.0)
|
.translation(vector![0.0, 4.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rad = 1.0;
|
let rad = 1.0;
|
||||||
// Build the dynamic box rigid body.
|
// Build the dynamic box rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 7.0 * rad, 0.0)
|
.translation(vector![0.0, 7.0 * rad, 0.0])
|
||||||
.can_sleep(false)
|
.can_sleep(false)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 2.0 * rad, 0.0)
|
.translation(vector![0.0, 2.0 * rad, 0.0])
|
||||||
.can_sleep(false)
|
.can_sleep(false)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.look_at(Point3::new(100.0, -10.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, -10.0, 100.0], Point::origin());
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,18 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
fn prismatic_repro(
|
fn prismatic_repro(
|
||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
joints: &mut JointSet,
|
joints: &mut JointSet,
|
||||||
box_center: Point3<f32>,
|
box_center: Point<f32>,
|
||||||
) {
|
) {
|
||||||
let box_rb = bodies.insert(
|
let box_rb = bodies.insert(
|
||||||
RigidBodyBuilder::new_dynamic()
|
RigidBodyBuilder::new_dynamic()
|
||||||
.translation(box_center.x, box_center.y, box_center.z)
|
.translation(vector![box_center.x, box_center.y, box_center.z])
|
||||||
.build(),
|
.build(),
|
||||||
);
|
);
|
||||||
colliders.insert(
|
colliders.insert_with_parent(
|
||||||
ColliderBuilder::cuboid(1.0, 0.25, 1.0).build(),
|
ColliderBuilder::cuboid(1.0, 0.25, 1.0).build(),
|
||||||
box_rb,
|
box_rb,
|
||||||
bodies,
|
bodies,
|
||||||
@@ -22,32 +20,32 @@ fn prismatic_repro(
|
|||||||
|
|
||||||
let wheel_y = -1.0;
|
let wheel_y = -1.0;
|
||||||
let wheel_positions = vec![
|
let wheel_positions = vec![
|
||||||
Vector3::new(1.0, wheel_y, -1.0),
|
vector![1.0, wheel_y, -1.0],
|
||||||
Vector3::new(-1.0, wheel_y, -1.0),
|
vector![-1.0, wheel_y, -1.0],
|
||||||
Vector3::new(1.0, wheel_y, 1.0),
|
vector![1.0, wheel_y, 1.0],
|
||||||
Vector3::new(-1.0, wheel_y, 1.0),
|
vector![-1.0, wheel_y, 1.0],
|
||||||
];
|
];
|
||||||
|
|
||||||
for pos in wheel_positions {
|
for pos in wheel_positions {
|
||||||
let wheel_pos_in_world = box_center + pos;
|
let wheel_pos_in_world = box_center + pos;
|
||||||
let wheel_rb = bodies.insert(
|
let wheel_rb = bodies.insert(
|
||||||
RigidBodyBuilder::new_dynamic()
|
RigidBodyBuilder::new_dynamic()
|
||||||
.translation(
|
.translation(vector![
|
||||||
wheel_pos_in_world.x,
|
wheel_pos_in_world.x,
|
||||||
wheel_pos_in_world.y,
|
wheel_pos_in_world.y,
|
||||||
wheel_pos_in_world.z,
|
wheel_pos_in_world.z
|
||||||
)
|
])
|
||||||
.build(),
|
.build(),
|
||||||
);
|
);
|
||||||
colliders.insert(ColliderBuilder::ball(0.5).build(), wheel_rb, bodies);
|
colliders.insert_with_parent(ColliderBuilder::ball(0.5).build(), wheel_rb, bodies);
|
||||||
|
|
||||||
let mut prismatic = rapier3d::dynamics::PrismaticJoint::new(
|
let mut prismatic = rapier3d::dynamics::PrismaticJoint::new(
|
||||||
Point3::new(pos.x, pos.y, pos.z),
|
point![pos.x, pos.y, pos.z],
|
||||||
Vector3::y_axis(),
|
Vector::y_axis(),
|
||||||
Vector3::default(),
|
Vector::zeros(),
|
||||||
Point3::new(0.0, 0.0, 0.0),
|
Point::origin(),
|
||||||
Vector3::y_axis(),
|
Vector::y_axis(),
|
||||||
Vector3::default(),
|
Vector::default(),
|
||||||
);
|
);
|
||||||
prismatic.configure_motor_model(rapier3d::dynamics::SpringModel::VelocityBased);
|
prismatic.configure_motor_model(rapier3d::dynamics::SpringModel::VelocityBased);
|
||||||
let (stiffness, damping) = (0.05, 0.2);
|
let (stiffness, damping) = (0.05, 0.2);
|
||||||
@@ -59,10 +57,10 @@ fn prismatic_repro(
|
|||||||
// put a small box under one of the wheels
|
// put a small box under one of the wheels
|
||||||
let gravel = bodies.insert(
|
let gravel = bodies.insert(
|
||||||
RigidBodyBuilder::new_dynamic()
|
RigidBodyBuilder::new_dynamic()
|
||||||
.translation(box_center.x + 1.0, box_center.y - 2.4, -1.0)
|
.translation(vector![box_center.x + 1.0, box_center.y - 2.4, -1.0])
|
||||||
.build(),
|
.build(),
|
||||||
);
|
);
|
||||||
colliders.insert(
|
colliders.insert_with_parent(
|
||||||
ColliderBuilder::cuboid(0.5, 0.1, 0.5).build(),
|
ColliderBuilder::cuboid(0.5, 0.1, 0.5).build(),
|
||||||
gravel,
|
gravel,
|
||||||
bodies,
|
bodies,
|
||||||
@@ -84,22 +82,22 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
prismatic_repro(
|
prismatic_repro(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
&mut joints,
|
&mut joints,
|
||||||
Point3::new(0.0, 5.0, 0.0),
|
point![0.0, 5.0, 0.0],
|
||||||
);
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
|
testbed.look_at(point![10.0, 10.0, 10.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Isometry3, Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -17,30 +15,30 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, 0.4)
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, 0.4)
|
||||||
.friction(0.15)
|
.friction(0.15)
|
||||||
// .restitution(0.5)
|
// .restitution(0.5)
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rolling ball
|
* Rolling ball
|
||||||
*/
|
*/
|
||||||
let ball_rad = 0.1;
|
let ball_rad = 0.1;
|
||||||
let rb = RigidBodyBuilder::new_dynamic()
|
let rb = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 0.2, 0.0)
|
.translation(vector![0.0, 0.2, 0.0])
|
||||||
.linvel(10.0, 0.0, 0.0)
|
.linvel(vector![10.0, 0.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ball_handle = bodies.insert(rb);
|
let ball_handle = bodies.insert(rb);
|
||||||
let collider = ColliderBuilder::ball(ball_rad).density(100.0).build();
|
let collider = ColliderBuilder::ball(ball_rad).density(100.0).build();
|
||||||
colliders.insert(collider, ball_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ball_handle, &mut bodies);
|
||||||
|
|
||||||
let mut linvel = Vector3::zeros();
|
let mut linvel = Vector::zeros();
|
||||||
let mut angvel = Vector3::zeros();
|
let mut angvel = Vector::zeros();
|
||||||
let mut pos = Isometry3::identity();
|
let mut pos = Isometry::identity();
|
||||||
let mut step = 0;
|
let mut step = 0;
|
||||||
let snapped_frame = 51;
|
let snapped_frame = 51;
|
||||||
|
|
||||||
@@ -68,5 +66,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
|
testbed.look_at(point![10.0, 10.0, 10.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Isometry3, Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet, SharedShape};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -17,30 +15,30 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size)
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size)
|
||||||
.friction(0.15)
|
.friction(0.15)
|
||||||
// .restitution(0.5)
|
// .restitution(0.5)
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rolling ball
|
* Rolling ball
|
||||||
*/
|
*/
|
||||||
let ball_rad = 0.1;
|
let ball_rad = 0.1;
|
||||||
let rb = RigidBodyBuilder::new_dynamic()
|
let rb = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 0.2, 0.0)
|
.translation(vector![0.0, 0.2, 0.0])
|
||||||
.linvel(10.0, 0.0, 0.0)
|
.linvel(vector![10.0, 0.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ball_handle = bodies.insert(rb);
|
let ball_handle = bodies.insert(rb);
|
||||||
let collider = ColliderBuilder::ball(ball_rad).density(100.0).build();
|
let collider = ColliderBuilder::ball(ball_rad).density(100.0).build();
|
||||||
let ball_coll_handle = colliders.insert(collider, ball_handle, &mut bodies);
|
let ball_coll_handle = colliders.insert_with_parent(collider, ball_handle, &mut bodies);
|
||||||
|
|
||||||
let mut linvel = Vector3::zeros();
|
let mut linvel = Vector::zeros();
|
||||||
let mut angvel = Vector3::zeros();
|
let mut angvel = Vector::zeros();
|
||||||
let mut pos = Isometry3::identity();
|
let mut pos = Isometry::identity();
|
||||||
let mut step = 0;
|
let mut step = 0;
|
||||||
let snapped_frame = 51;
|
let snapped_frame = 51;
|
||||||
|
|
||||||
@@ -90,7 +88,9 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shiftz - centerz + offset;
|
let z = k as f32 * shiftz - centerz + offset;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let collider = match j % 5 {
|
let collider = match j % 5 {
|
||||||
@@ -103,7 +103,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
_ => ColliderBuilder::capsule_y(rad, rad).build(),
|
_ => ColliderBuilder::capsule_y(rad, rad).build(),
|
||||||
};
|
};
|
||||||
|
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,5 +114,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
|
testbed.look_at(point![10.0, 10.0, 10.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -13,31 +11,31 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Triangle ground.
|
// Triangle ground.
|
||||||
let vtx = [
|
let vtx = [
|
||||||
Point3::new(-10.0, 0.0, -10.0),
|
point![-10.0, 0.0, -10.0],
|
||||||
Point3::new(10.0, 0.0, -10.0),
|
point![10.0, 0.0, -10.0],
|
||||||
Point3::new(0.0, 0.0, 10.0),
|
point![0.0, 0.0, 10.0],
|
||||||
];
|
];
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, 0.0, 0.0)
|
.translation(vector![0.0, 0.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::triangle(vtx[0], vtx[1], vtx[2]).build();
|
let collider = ColliderBuilder::triangle(vtx[0], vtx[1], vtx[2]).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
// Dynamic box rigid body.
|
// Dynamic box rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(1.1, 0.01, 0.0)
|
.translation(vector![1.1, 0.01, 0.0])
|
||||||
// .rotation(Vector3::new(0.8, 0.2, 0.1))
|
// .rotation(Vector3::new(0.8, 0.2, 0.1))
|
||||||
.can_sleep(false)
|
.can_sleep(false)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(20.0, 0.1, 1.0).build();
|
let collider = ColliderBuilder::cuboid(20.0, 0.1, 1.0).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
|
testbed.look_at(point![10.0, 10.0, 10.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -14,14 +12,14 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Triangle ground.
|
// Triangle ground.
|
||||||
let width = 0.5;
|
let width = 0.5;
|
||||||
let vtx = vec![
|
let vtx = vec![
|
||||||
Point3::new(-width, 0.0, -width),
|
point![-width, 0.0, -width],
|
||||||
Point3::new(width, 0.0, -width),
|
point![width, 0.0, -width],
|
||||||
Point3::new(width, 0.0, width),
|
point![width, 0.0, width],
|
||||||
Point3::new(-width, 0.0, width),
|
point![-width, 0.0, width],
|
||||||
Point3::new(-width, -width, -width),
|
point![-width, -width, -width],
|
||||||
Point3::new(width, -width, -width),
|
point![width, -width, -width],
|
||||||
Point3::new(width, -width, width),
|
point![width, -width, width],
|
||||||
Point3::new(-width, -width, width),
|
point![-width, -width, width],
|
||||||
];
|
];
|
||||||
let idx = vec![
|
let idx = vec![
|
||||||
[0, 2, 1],
|
[0, 2, 1],
|
||||||
@@ -40,25 +38,25 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Dynamic box rigid body.
|
// Dynamic box rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 35.0, 0.0)
|
.translation(vector![0.0, 35.0, 0.0])
|
||||||
// .rotation(Vector3::new(0.8, 0.2, 0.1))
|
// .rotation(Vector3::new(0.8, 0.2, 0.1))
|
||||||
.can_sleep(false)
|
.can_sleep(false)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(1.0, 2.0, 1.0).build();
|
let collider = ColliderBuilder::cuboid(1.0, 2.0, 1.0).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, 0.0, 0.0)
|
.translation(vector![0.0, 0.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::trimesh(vtx, idx).build();
|
let collider = ColliderBuilder::trimesh(vtx, idx).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
testbed.set_initial_body_color(handle, Point3::new(0.3, 0.3, 0.3));
|
testbed.set_initial_body_color(handle, [0.3, 0.3, 0.3]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
|
testbed.look_at(point![10.0, 10.0, 10.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point3, Translation3, UnitQuaternion, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -31,7 +29,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let width = 1.0;
|
let width = 1.0;
|
||||||
let thickness = 0.1;
|
let thickness = 0.1;
|
||||||
|
|
||||||
let colors = [Point3::new(0.7, 0.5, 0.9), Point3::new(0.6, 1.0, 0.6)];
|
let colors = [[0.7, 0.5, 0.9], [0.6, 1.0, 0.6]];
|
||||||
|
|
||||||
let mut curr_angle = 0.0;
|
let mut curr_angle = 0.0;
|
||||||
let mut curr_rad = 10.0;
|
let mut curr_rad = 10.0;
|
||||||
@@ -50,16 +48,16 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let tilt = if nudged || i == num - 1 { 0.2 } else { 0.0 };
|
let tilt = if nudged || i == num - 1 { 0.2 } else { 0.0 };
|
||||||
|
|
||||||
if skip == 0 {
|
if skip == 0 {
|
||||||
let rot = UnitQuaternion::new(Vector3::y() * curr_angle);
|
let rot = Rotation::new(Vector::y() * curr_angle);
|
||||||
let tilt = UnitQuaternion::new(rot * Vector3::z() * tilt);
|
let tilt = Rotation::new(rot * Vector::z() * tilt);
|
||||||
let position =
|
let position =
|
||||||
Translation3::new(x * curr_rad, width * 2.0 + ground_height, z * curr_rad)
|
Translation::new(x * curr_rad, width * 2.0 + ground_height, z * curr_rad)
|
||||||
* tilt
|
* tilt
|
||||||
* rot;
|
* rot;
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().position(position).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic().position(position).build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(thickness, width * 2.0, width).build();
|
let collider = ColliderBuilder::cuboid(thickness, width * 2.0, width).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
testbed.set_initial_body_color(handle, colors[i % 2]);
|
testbed.set_initial_body_color(handle, colors[i % 2]);
|
||||||
} else {
|
} else {
|
||||||
skip -= 1;
|
skip -= 1;
|
||||||
@@ -76,5 +74,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
const MAX_NUMBER_OF_BODIES: usize = 400;
|
const MAX_NUMBER_OF_BODIES: usize = 400;
|
||||||
@@ -18,16 +16,16 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 2.1; // 16.0;
|
let ground_height = 2.1; // 16.0;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
// Callback that will be executed on the main loop to handle proximities.
|
// Callback that will be executed on the main loop to handle proximities.
|
||||||
testbed.add_callback(move |mut graphics, physics, _, run_state| {
|
testbed.add_callback(move |mut graphics, physics, _, run_state| {
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 10.0, 0.0)
|
.translation(vector![0.0, 10.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = physics.bodies.insert(rigid_body);
|
let handle = physics.bodies.insert(rigid_body);
|
||||||
let collider = match run_state.timestep_id % 3 {
|
let collider = match run_state.timestep_id % 3 {
|
||||||
@@ -38,7 +36,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
physics
|
physics
|
||||||
.colliders
|
.colliders
|
||||||
.insert(collider, handle, &mut physics.bodies);
|
.insert_with_parent(collider, handle, &mut physics.bodies);
|
||||||
|
|
||||||
if let Some(graphics) = &mut graphics {
|
if let Some(graphics) = &mut graphics {
|
||||||
graphics.add_body(handle, &physics.bodies, &physics.colliders);
|
graphics.add_body(handle, &physics.bodies, &physics.colliders);
|
||||||
@@ -83,5 +81,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// .physics_state_mut()
|
// .physics_state_mut()
|
||||||
// .integration_parameters
|
// .integration_parameters
|
||||||
// .velocity_based_erp = 0.2;
|
// .velocity_based_erp = 0.2;
|
||||||
testbed.look_at(Point3::new(-30.0, 4.0, -30.0), Point3::new(0.0, 1.0, 0.0));
|
testbed.look_at(point![-30.0, 4.0, -30.0], point![0.0, 1.0, 0.0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
extern crate nalgebra as na;
|
use rapier3d::prelude::*;
|
||||||
|
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::harness::Harness;
|
use rapier_testbed3d::harness::Harness;
|
||||||
|
|
||||||
pub fn init_world(harness: &mut Harness) {
|
pub fn init_world(harness: &mut Harness) {
|
||||||
@@ -19,11 +16,11 @@ pub fn init_world(harness: &mut Harness) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -47,10 +44,12 @@ pub fn init_world(harness: &mut Harness) {
|
|||||||
let z = k as f32 * shift - centerz + offset;
|
let z = k as f32 * shift - centerz + offset;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::capsule_y(rad, rad).build();
|
let collider = ColliderBuilder::capsule_y(rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use na::{ComplexField, DMatrix, Isometry3, Point3, Vector3};
|
use na::ComplexField;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet, SharedShape};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -14,7 +13,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
/*
|
/*
|
||||||
* Ground
|
* Ground
|
||||||
*/
|
*/
|
||||||
let ground_size = Vector3::new(100.0, 1.0, 100.0);
|
let ground_size = Vector::new(100.0, 1.0, 100.0);
|
||||||
let nsubdivs = 20;
|
let nsubdivs = 20;
|
||||||
|
|
||||||
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
||||||
@@ -34,7 +33,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::heightfield(heights, ground_size).build();
|
let collider = ColliderBuilder::heightfield(heights, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -55,7 +54,9 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shift - centerz;
|
let z = k as f32 * shift - centerz;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let collider = match j % 6 {
|
let collider = match j % 6 {
|
||||||
@@ -69,15 +70,15 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
_ => {
|
_ => {
|
||||||
let shapes = vec![
|
let shapes = vec![
|
||||||
(
|
(
|
||||||
Isometry3::identity(),
|
Isometry::identity(),
|
||||||
SharedShape::cuboid(rad, rad / 2.0, rad / 2.0),
|
SharedShape::cuboid(rad, rad / 2.0, rad / 2.0),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
Isometry3::translation(rad, 0.0, 0.0),
|
Isometry::translation(rad, 0.0, 0.0),
|
||||||
SharedShape::cuboid(rad / 2.0, rad, rad / 2.0),
|
SharedShape::cuboid(rad / 2.0, rad, rad / 2.0),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
Isometry3::translation(-rad, 0.0, 0.0),
|
Isometry::translation(-rad, 0.0, 0.0),
|
||||||
SharedShape::cuboid(rad / 2.0, rad, rad / 2.0),
|
SharedShape::cuboid(rad / 2.0, rad, rad / 2.0),
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
@@ -86,7 +87,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -95,5 +96,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,49 +1,44 @@
|
|||||||
use na::{Isometry3, Point3, Unit, UnitQuaternion, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{
|
|
||||||
BallJoint, FixedJoint, JointSet, PrismaticJoint, RevoluteJoint, RigidBodyBuilder,
|
|
||||||
RigidBodyHandle, RigidBodySet, RigidBodyType,
|
|
||||||
};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
fn create_prismatic_joints(
|
fn create_prismatic_joints(
|
||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
joints: &mut JointSet,
|
joints: &mut JointSet,
|
||||||
origin: Point3<f32>,
|
origin: Point<f32>,
|
||||||
num: usize,
|
num: usize,
|
||||||
) {
|
) {
|
||||||
let rad = 0.4;
|
let rad = 0.4;
|
||||||
let shift = 2.0;
|
let shift = 2.0;
|
||||||
|
|
||||||
let ground = RigidBodyBuilder::new_static()
|
let ground = RigidBodyBuilder::new_static()
|
||||||
.translation(origin.x, origin.y, origin.z)
|
.translation(vector![origin.x, origin.y, origin.z])
|
||||||
.build();
|
.build();
|
||||||
let mut curr_parent = bodies.insert(ground);
|
let mut curr_parent = bodies.insert(ground);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, curr_parent, bodies);
|
colliders.insert_with_parent(collider, curr_parent, bodies);
|
||||||
|
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
let z = origin.z + (i + 1) as f32 * shift;
|
let z = origin.z + (i + 1) as f32 * shift;
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(origin.x, origin.y, z)
|
.translation(vector![origin.x, origin.y, z])
|
||||||
.build();
|
.build();
|
||||||
let curr_child = bodies.insert(rigid_body);
|
let curr_child = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, curr_child, bodies);
|
colliders.insert_with_parent(collider, curr_child, bodies);
|
||||||
|
|
||||||
let axis = if i % 2 == 0 {
|
let axis = if i % 2 == 0 {
|
||||||
Unit::new_normalize(Vector3::new(1.0, 1.0, 0.0))
|
UnitVector::new_normalize(vector![1.0, 1.0, 0.0])
|
||||||
} else {
|
} else {
|
||||||
Unit::new_normalize(Vector3::new(-1.0, 1.0, 0.0))
|
UnitVector::new_normalize(vector![-1.0, 1.0, 0.0])
|
||||||
};
|
};
|
||||||
|
|
||||||
let z = Vector3::z();
|
let z = Vector::z();
|
||||||
let mut prism = PrismaticJoint::new(
|
let mut prism = PrismaticJoint::new(
|
||||||
Point3::new(0.0, 0.0, 0.0),
|
point![0.0, 0.0, 0.0],
|
||||||
axis,
|
axis,
|
||||||
z,
|
z,
|
||||||
Point3::new(0.0, 0.0, -shift),
|
point![0.0, 0.0, -shift],
|
||||||
axis,
|
axis,
|
||||||
z,
|
z,
|
||||||
);
|
);
|
||||||
@@ -61,40 +56,40 @@ fn create_actuated_prismatic_joints(
|
|||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
joints: &mut JointSet,
|
joints: &mut JointSet,
|
||||||
origin: Point3<f32>,
|
origin: Point<f32>,
|
||||||
num: usize,
|
num: usize,
|
||||||
) {
|
) {
|
||||||
let rad = 0.4;
|
let rad = 0.4;
|
||||||
let shift = 2.0;
|
let shift = 2.0;
|
||||||
|
|
||||||
let ground = RigidBodyBuilder::new_static()
|
let ground = RigidBodyBuilder::new_static()
|
||||||
.translation(origin.x, origin.y, origin.z)
|
.translation(vector![origin.x, origin.y, origin.z])
|
||||||
.build();
|
.build();
|
||||||
let mut curr_parent = bodies.insert(ground);
|
let mut curr_parent = bodies.insert(ground);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, curr_parent, bodies);
|
colliders.insert_with_parent(collider, curr_parent, bodies);
|
||||||
|
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
let z = origin.z + (i + 1) as f32 * shift;
|
let z = origin.z + (i + 1) as f32 * shift;
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(origin.x, origin.y, z)
|
.translation(vector![origin.x, origin.y, z])
|
||||||
.build();
|
.build();
|
||||||
let curr_child = bodies.insert(rigid_body);
|
let curr_child = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, curr_child, bodies);
|
colliders.insert_with_parent(collider, curr_child, bodies);
|
||||||
|
|
||||||
let axis = if i % 2 == 0 {
|
let axis = if i % 2 == 0 {
|
||||||
Unit::new_normalize(Vector3::new(1.0, 1.0, 0.0))
|
UnitVector::new_normalize(vector![1.0, 1.0, 0.0])
|
||||||
} else {
|
} else {
|
||||||
Unit::new_normalize(Vector3::new(-1.0, 1.0, 0.0))
|
UnitVector::new_normalize(vector![-1.0, 1.0, 0.0])
|
||||||
};
|
};
|
||||||
|
|
||||||
let z = Vector3::z();
|
let z = Vector::z();
|
||||||
let mut prism = PrismaticJoint::new(
|
let mut prism = PrismaticJoint::new(
|
||||||
Point3::new(0.0, 0.0, 0.0),
|
point![0.0, 0.0, 0.0],
|
||||||
axis,
|
axis,
|
||||||
z,
|
z,
|
||||||
Point3::new(0.0, 0.0, -shift),
|
point![0.0, 0.0, -shift],
|
||||||
axis,
|
axis,
|
||||||
z,
|
z,
|
||||||
);
|
);
|
||||||
@@ -128,27 +123,27 @@ fn create_revolute_joints(
|
|||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
joints: &mut JointSet,
|
joints: &mut JointSet,
|
||||||
origin: Point3<f32>,
|
origin: Point<f32>,
|
||||||
num: usize,
|
num: usize,
|
||||||
) {
|
) {
|
||||||
let rad = 0.4;
|
let rad = 0.4;
|
||||||
let shift = 2.0;
|
let shift = 2.0;
|
||||||
|
|
||||||
let ground = RigidBodyBuilder::new_static()
|
let ground = RigidBodyBuilder::new_static()
|
||||||
.translation(origin.x, origin.y, 0.0)
|
.translation(vector![origin.x, origin.y, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let mut curr_parent = bodies.insert(ground);
|
let mut curr_parent = bodies.insert(ground);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, curr_parent, bodies);
|
colliders.insert_with_parent(collider, curr_parent, bodies);
|
||||||
|
|
||||||
for i in 0..num {
|
for i in 0..num {
|
||||||
// Create four bodies.
|
// Create four bodies.
|
||||||
let z = origin.z + i as f32 * shift * 2.0 + shift;
|
let z = origin.z + i as f32 * shift * 2.0 + shift;
|
||||||
let positions = [
|
let positions = [
|
||||||
Isometry3::translation(origin.x, origin.y, z),
|
Isometry::translation(origin.x, origin.y, z),
|
||||||
Isometry3::translation(origin.x + shift, origin.y, z),
|
Isometry::translation(origin.x + shift, origin.y, z),
|
||||||
Isometry3::translation(origin.x + shift, origin.y, z + shift),
|
Isometry::translation(origin.x + shift, origin.y, z + shift),
|
||||||
Isometry3::translation(origin.x, origin.y, z + shift),
|
Isometry::translation(origin.x, origin.y, z + shift),
|
||||||
];
|
];
|
||||||
|
|
||||||
let mut handles = [curr_parent; 4];
|
let mut handles = [curr_parent; 4];
|
||||||
@@ -158,19 +153,19 @@ fn create_revolute_joints(
|
|||||||
.build();
|
.build();
|
||||||
handles[k] = bodies.insert(rigid_body);
|
handles[k] = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handles[k], bodies);
|
colliders.insert_with_parent(collider, handles[k], bodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup four joints.
|
// Setup four joints.
|
||||||
let o = Point3::origin();
|
let o = Point::origin();
|
||||||
let x = Vector3::x_axis();
|
let x = Vector::x_axis();
|
||||||
let z = Vector3::z_axis();
|
let z = Vector::z_axis();
|
||||||
|
|
||||||
let revs = [
|
let revs = [
|
||||||
RevoluteJoint::new(o, z, Point3::new(0.0, 0.0, -shift), z),
|
RevoluteJoint::new(o, z, point![0.0, 0.0, -shift], z),
|
||||||
RevoluteJoint::new(o, x, Point3::new(-shift, 0.0, 0.0), x),
|
RevoluteJoint::new(o, x, point![-shift, 0.0, 0.0], x),
|
||||||
RevoluteJoint::new(o, z, Point3::new(0.0, 0.0, -shift), z),
|
RevoluteJoint::new(o, z, point![0.0, 0.0, -shift], z),
|
||||||
RevoluteJoint::new(o, x, Point3::new(shift, 0.0, 0.0), x),
|
RevoluteJoint::new(o, x, point![shift, 0.0, 0.0], x),
|
||||||
];
|
];
|
||||||
|
|
||||||
joints.insert(bodies, curr_parent, handles[0], revs[0]);
|
joints.insert(bodies, curr_parent, handles[0], revs[0]);
|
||||||
@@ -186,7 +181,7 @@ fn create_fixed_joints(
|
|||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
joints: &mut JointSet,
|
joints: &mut JointSet,
|
||||||
origin: Point3<f32>,
|
origin: Point<f32>,
|
||||||
num: usize,
|
num: usize,
|
||||||
) {
|
) {
|
||||||
let rad = 0.4;
|
let rad = 0.4;
|
||||||
@@ -209,18 +204,22 @@ fn create_fixed_joints(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new(status)
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
.translation(origin.x + fk * shift, origin.y, origin.z + fi * shift)
|
.translation(vector![
|
||||||
|
origin.x + fk * shift,
|
||||||
|
origin.y,
|
||||||
|
origin.z + fi * shift
|
||||||
|
])
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad).build();
|
let collider = ColliderBuilder::ball(rad).build();
|
||||||
colliders.insert(collider, child_handle, bodies);
|
colliders.insert_with_parent(collider, child_handle, bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
let parent_handle = *body_handles.last().unwrap();
|
let parent_handle = *body_handles.last().unwrap();
|
||||||
let joint = FixedJoint::new(
|
let joint = FixedJoint::new(
|
||||||
Isometry3::identity(),
|
Isometry::identity(),
|
||||||
Isometry3::translation(0.0, 0.0, -shift),
|
Isometry::translation(0.0, 0.0, -shift),
|
||||||
);
|
);
|
||||||
joints.insert(bodies, parent_handle, child_handle, joint);
|
joints.insert(bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
@@ -230,8 +229,8 @@ fn create_fixed_joints(
|
|||||||
let parent_index = body_handles.len() - num;
|
let parent_index = body_handles.len() - num;
|
||||||
let parent_handle = body_handles[parent_index];
|
let parent_handle = body_handles[parent_index];
|
||||||
let joint = FixedJoint::new(
|
let joint = FixedJoint::new(
|
||||||
Isometry3::identity(),
|
Isometry::identity(),
|
||||||
Isometry3::translation(-shift, 0.0, 0.0),
|
Isometry::translation(-shift, 0.0, 0.0),
|
||||||
);
|
);
|
||||||
joints.insert(bodies, parent_handle, child_handle, joint);
|
joints.insert(bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
@@ -264,16 +263,16 @@ fn create_ball_joints(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new(status)
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
.translation(fk * shift, 0.0, fi * shift * 2.0)
|
.translation(vector![fk * shift, 0.0, fi * shift * 2.0])
|
||||||
.build();
|
.build();
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::capsule_z(rad * 1.25, rad).build();
|
let collider = ColliderBuilder::capsule_z(rad * 1.25, rad).build();
|
||||||
colliders.insert(collider, child_handle, bodies);
|
colliders.insert_with_parent(collider, child_handle, bodies);
|
||||||
|
|
||||||
// Vertical joint.
|
// Vertical joint.
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
let parent_handle = *body_handles.last().unwrap();
|
let parent_handle = *body_handles.last().unwrap();
|
||||||
let joint = BallJoint::new(Point3::origin(), Point3::new(0.0, 0.0, -shift * 2.0));
|
let joint = BallJoint::new(Point::origin(), point![0.0, 0.0, -shift * 2.0]);
|
||||||
joints.insert(bodies, parent_handle, child_handle, joint);
|
joints.insert(bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,7 +280,7 @@ fn create_ball_joints(
|
|||||||
if k > 0 {
|
if k > 0 {
|
||||||
let parent_index = body_handles.len() - num;
|
let parent_index = body_handles.len() - num;
|
||||||
let parent_handle = body_handles[parent_index];
|
let parent_handle = body_handles[parent_index];
|
||||||
let joint = BallJoint::new(Point3::origin(), Point3::new(-shift, 0.0, 0.0));
|
let joint = BallJoint::new(Point::origin(), point![-shift, 0.0, 0.0]);
|
||||||
joints.insert(bodies, parent_handle, child_handle, joint);
|
joints.insert(bodies, parent_handle, child_handle, joint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,7 +293,7 @@ fn create_actuated_revolute_joints(
|
|||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
joints: &mut JointSet,
|
joints: &mut JointSet,
|
||||||
origin: Point3<f32>,
|
origin: Point<f32>,
|
||||||
num: usize,
|
num: usize,
|
||||||
) {
|
) {
|
||||||
let rad = 0.4;
|
let rad = 0.4;
|
||||||
@@ -302,10 +301,10 @@ fn create_actuated_revolute_joints(
|
|||||||
|
|
||||||
// We will reuse this base configuration for all the joints here.
|
// We will reuse this base configuration for all the joints here.
|
||||||
let joint_template = RevoluteJoint::new(
|
let joint_template = RevoluteJoint::new(
|
||||||
Point3::origin(),
|
Point::origin(),
|
||||||
Vector3::z_axis(),
|
Vector::z_axis(),
|
||||||
Point3::new(0.0, 0.0, -shift),
|
point![0.0, 0.0, -shift],
|
||||||
Vector3::z_axis(),
|
Vector::z_axis(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut parent_handle = RigidBodyHandle::invalid();
|
let mut parent_handle = RigidBodyHandle::invalid();
|
||||||
@@ -325,13 +324,13 @@ fn create_actuated_revolute_joints(
|
|||||||
let shifty = (i >= 1) as u32 as f32 * -2.0;
|
let shifty = (i >= 1) as u32 as f32 * -2.0;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new(status)
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
.translation(origin.x, origin.y + shifty, origin.z + fi * shift)
|
.translation(vector![origin.x, origin.y + shifty, origin.z + fi * shift])
|
||||||
// .rotation(Vector3::new(0.0, fi * 1.1, 0.0))
|
// .rotation(Vector3::new(0.0, fi * 1.1, 0.0))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad * 2.0, rad * 6.0 / (fi + 1.0), rad).build();
|
let collider = ColliderBuilder::cuboid(rad * 2.0, rad * 6.0 / (fi + 1.0), rad).build();
|
||||||
colliders.insert(collider, child_handle, bodies);
|
colliders.insert_with_parent(collider, child_handle, bodies);
|
||||||
|
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
let mut joint = joint_template.clone();
|
let mut joint = joint_template.clone();
|
||||||
@@ -360,14 +359,14 @@ fn create_actuated_ball_joints(
|
|||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
joints: &mut JointSet,
|
joints: &mut JointSet,
|
||||||
origin: Point3<f32>,
|
origin: Point<f32>,
|
||||||
num: usize,
|
num: usize,
|
||||||
) {
|
) {
|
||||||
let rad = 0.4;
|
let rad = 0.4;
|
||||||
let shift = 2.0;
|
let shift = 2.0;
|
||||||
|
|
||||||
// We will reuse this base configuration for all the joints here.
|
// We will reuse this base configuration for all the joints here.
|
||||||
let joint_template = BallJoint::new(Point3::new(0.0, 0.0, shift), Point3::origin());
|
let joint_template = BallJoint::new(point![0.0, 0.0, shift], Point::origin());
|
||||||
|
|
||||||
let mut parent_handle = RigidBodyHandle::invalid();
|
let mut parent_handle = RigidBodyHandle::invalid();
|
||||||
|
|
||||||
@@ -384,24 +383,24 @@ fn create_actuated_ball_joints(
|
|||||||
};
|
};
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new(status)
|
let rigid_body = RigidBodyBuilder::new(status)
|
||||||
.translation(origin.x, origin.y, origin.z + fi * shift)
|
.translation(vector![origin.x, origin.y, origin.z + fi * shift])
|
||||||
// .rotation(Vector3::new(0.0, fi * 1.1, 0.0))
|
// .rotation(Vector3::new(0.0, fi * 1.1, 0.0))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
let child_handle = bodies.insert(rigid_body);
|
let child_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::capsule_y(rad * 2.0 / (fi + 1.0), rad).build();
|
let collider = ColliderBuilder::capsule_y(rad * 2.0 / (fi + 1.0), rad).build();
|
||||||
colliders.insert(collider, child_handle, bodies);
|
colliders.insert_with_parent(collider, child_handle, bodies);
|
||||||
|
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
let mut joint = joint_template.clone();
|
let mut joint = joint_template.clone();
|
||||||
|
|
||||||
if i == 1 {
|
if i == 1 {
|
||||||
joint.configure_motor_velocity(Vector3::new(0.0, 0.5, -2.0), 0.1);
|
joint.configure_motor_velocity(vector![0.0, 0.5, -2.0], 0.1);
|
||||||
} else if i == num - 1 {
|
} else if i == num - 1 {
|
||||||
let stiffness = 0.2;
|
let stiffness = 0.2;
|
||||||
let damping = 1.0;
|
let damping = 1.0;
|
||||||
joint.configure_motor_position(
|
joint.configure_motor_position(
|
||||||
UnitQuaternion::new(Vector3::new(0.0, 1.0, 3.14 / 2.0)),
|
Rotation::new(vector![0.0, 1.0, 3.14 / 2.0]),
|
||||||
stiffness,
|
stiffness,
|
||||||
damping,
|
damping,
|
||||||
);
|
);
|
||||||
@@ -426,42 +425,42 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
&mut joints,
|
&mut joints,
|
||||||
Point3::new(20.0, 5.0, 0.0),
|
point![20.0, 5.0, 0.0],
|
||||||
4,
|
4,
|
||||||
);
|
);
|
||||||
create_actuated_prismatic_joints(
|
create_actuated_prismatic_joints(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
&mut joints,
|
&mut joints,
|
||||||
Point3::new(25.0, 5.0, 0.0),
|
point![25.0, 5.0, 0.0],
|
||||||
4,
|
4,
|
||||||
);
|
);
|
||||||
create_revolute_joints(
|
create_revolute_joints(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
&mut joints,
|
&mut joints,
|
||||||
Point3::new(20.0, 0.0, 0.0),
|
point![20.0, 0.0, 0.0],
|
||||||
3,
|
3,
|
||||||
);
|
);
|
||||||
create_fixed_joints(
|
create_fixed_joints(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
&mut joints,
|
&mut joints,
|
||||||
Point3::new(0.0, 10.0, 0.0),
|
point![0.0, 10.0, 0.0],
|
||||||
10,
|
10,
|
||||||
);
|
);
|
||||||
create_actuated_revolute_joints(
|
create_actuated_revolute_joints(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
&mut joints,
|
&mut joints,
|
||||||
Point3::new(20.0, 10.0, 0.0),
|
point![20.0, 10.0, 0.0],
|
||||||
6,
|
6,
|
||||||
);
|
);
|
||||||
create_actuated_ball_joints(
|
create_actuated_ball_joints(
|
||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
&mut joints,
|
&mut joints,
|
||||||
Point3::new(13.0, 10.0, 0.0),
|
point![13.0, 10.0, 0.0],
|
||||||
3,
|
3,
|
||||||
);
|
);
|
||||||
create_ball_joints(&mut bodies, &mut colliders, &mut joints, 15);
|
create_ball_joints(&mut bodies, &mut colliders, &mut joints, 15);
|
||||||
@@ -470,5 +469,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(15.0, 5.0, 42.0), Point3::new(13.0, 1.0, 1.0));
|
testbed.look_at(point![15.0, 5.0, 42.0], point![13.0, 1.0, 1.0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn build_block(
|
pub fn build_block(
|
||||||
testbed: &mut Testbed,
|
testbed: &mut Testbed,
|
||||||
bodies: &mut RigidBodySet,
|
bodies: &mut RigidBodySet,
|
||||||
colliders: &mut ColliderSet,
|
colliders: &mut ColliderSet,
|
||||||
half_extents: Vector3<f32>,
|
half_extents: Vector<f32>,
|
||||||
shift: Vector3<f32>,
|
shift: Vector<f32>,
|
||||||
mut numx: usize,
|
mut numx: usize,
|
||||||
numy: usize,
|
numy: usize,
|
||||||
mut numz: usize,
|
mut numz: usize,
|
||||||
@@ -17,8 +15,8 @@ pub fn build_block(
|
|||||||
let block_width = 2.0 * half_extents.z * numx as f32;
|
let block_width = 2.0 * half_extents.z * numx as f32;
|
||||||
let block_height = 2.0 * half_extents.y * numy as f32;
|
let block_height = 2.0 * half_extents.y * numy as f32;
|
||||||
let spacing = (half_extents.z * numx as f32 - half_extents.x) / (numz as f32 - 1.0);
|
let spacing = (half_extents.z * numx as f32 - half_extents.x) / (numz as f32 - 1.0);
|
||||||
let mut color0 = Point3::new(0.7, 0.5, 0.9);
|
let mut color0 = [0.7, 0.5, 0.9];
|
||||||
let mut color1 = Point3::new(0.6, 1.0, 0.6);
|
let mut color1 = [0.6, 1.0, 0.6];
|
||||||
|
|
||||||
for i in 0..numy {
|
for i in 0..numy {
|
||||||
std::mem::swap(&mut numx, &mut numz);
|
std::mem::swap(&mut numx, &mut numz);
|
||||||
@@ -41,15 +39,15 @@ pub fn build_block(
|
|||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(
|
.translation(vector![
|
||||||
x + dim.x + shift.x,
|
x + dim.x + shift.x,
|
||||||
y + dim.y + shift.y,
|
y + dim.y + shift.y,
|
||||||
z + dim.z + shift.z,
|
z + dim.z + shift.z
|
||||||
)
|
])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert_with_parent(collider, handle, bodies);
|
||||||
|
|
||||||
testbed.set_initial_body_color(handle, color0);
|
testbed.set_initial_body_color(handle, color0);
|
||||||
std::mem::swap(&mut color0, &mut color1);
|
std::mem::swap(&mut color0, &mut color1);
|
||||||
@@ -64,15 +62,15 @@ pub fn build_block(
|
|||||||
for j in 0..(block_width / (dim.z as f32 * 2.0)) as usize {
|
for j in 0..(block_width / (dim.z as f32 * 2.0)) as usize {
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(
|
.translation(vector![
|
||||||
i as f32 * dim.x * 2.0 + dim.x + shift.x,
|
i as f32 * dim.x * 2.0 + dim.x + shift.x,
|
||||||
dim.y + shift.y + block_height,
|
dim.y + shift.y + block_height,
|
||||||
j as f32 * dim.z * 2.0 + dim.z + shift.z,
|
j as f32 * dim.z * 2.0 + dim.z + shift.z
|
||||||
)
|
])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build();
|
||||||
colliders.insert(collider, handle, bodies);
|
colliders.insert_with_parent(collider, handle, bodies);
|
||||||
testbed.set_initial_body_color(handle, color0);
|
testbed.set_initial_body_color(handle, color0);
|
||||||
std::mem::swap(&mut color0, &mut color1);
|
std::mem::swap(&mut color0, &mut color1);
|
||||||
}
|
}
|
||||||
@@ -94,16 +92,16 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
*/
|
*/
|
||||||
let half_extents = Vector3::new(0.02, 0.1, 0.4) / 2.0 * 10.0;
|
let half_extents = vector![0.02, 0.1, 0.4] / 2.0 * 10.0;
|
||||||
let mut block_height = 0.0;
|
let mut block_height = 0.0;
|
||||||
// These should only be set to odd values otherwise
|
// These should only be set to odd values otherwise
|
||||||
// the blocks won't align in the nicest way.
|
// the blocks won't align in the nicest way.
|
||||||
@@ -120,7 +118,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
&mut bodies,
|
&mut bodies,
|
||||||
&mut colliders,
|
&mut colliders,
|
||||||
half_extents,
|
half_extents,
|
||||||
Vector3::new(-block_width / 2.0, block_height, -block_width / 2.0),
|
vector![-block_width / 2.0, block_height, -block_width / 2.0],
|
||||||
numx,
|
numx,
|
||||||
numy,
|
numy,
|
||||||
numz,
|
numz,
|
||||||
@@ -135,5 +133,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
// This shows a bug when a cylinder is in contact with a very large
|
// This shows a bug when a cylinder is in contact with a very large
|
||||||
@@ -21,41 +19,41 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A rectangle that only rotates along the `x` axis.
|
* A rectangle that only rotates along the `x` axis.
|
||||||
*/
|
*/
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 3.0, 0.0)
|
.translation(vector![0.0, 3.0, 0.0])
|
||||||
.lock_translations()
|
.lock_translations()
|
||||||
.restrict_rotations(true, false, false)
|
.restrict_rotations(true, false, false)
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(0.2, 0.6, 2.0).build();
|
let collider = ColliderBuilder::cuboid(0.2, 0.6, 2.0).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A tilted capsule that cannot rotate.
|
* A tilted capsule that cannot rotate.
|
||||||
*/
|
*/
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 5.0, 0.0)
|
.translation(vector![0.0, 5.0, 0.0])
|
||||||
.rotation(Vector3::x() * 1.0)
|
.rotation(Vector::x() * 1.0)
|
||||||
.lock_rotations()
|
.lock_rotations()
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::capsule_y(0.6, 0.4).build();
|
let collider = ColliderBuilder::capsule_y(0.6, 0.4).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
let collider = ColliderBuilder::capsule_x(0.6, 0.4).build();
|
let collider = ColliderBuilder::capsule_x(0.6, 0.4).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(10.0, 3.0, 0.0), Point3::new(0.0, 3.0, 0.0));
|
testbed.look_at(point![10.0, 3.0, 0.0], point![0.0, 3.0, 0.0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
use na::{Point3, Vector3};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderHandle, ColliderSet};
|
|
||||||
use rapier3d::pipeline::{ContactModificationContext, PhysicsHooks, PhysicsHooksFlags};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
struct OneWayPlatformHook {
|
struct OneWayPlatformHook {
|
||||||
@@ -10,10 +7,6 @@ struct OneWayPlatformHook {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl PhysicsHooks<RigidBodySet, ColliderSet> for OneWayPlatformHook {
|
impl PhysicsHooks<RigidBodySet, ColliderSet> for OneWayPlatformHook {
|
||||||
fn active_hooks(&self) -> PhysicsHooksFlags {
|
|
||||||
PhysicsHooksFlags::MODIFY_SOLVER_CONTACTS
|
|
||||||
}
|
|
||||||
|
|
||||||
fn modify_solver_contacts(
|
fn modify_solver_contacts(
|
||||||
&self,
|
&self,
|
||||||
context: &mut ContactModificationContext<RigidBodySet, ColliderSet>,
|
context: &mut ContactModificationContext<RigidBodySet, ColliderSet>,
|
||||||
@@ -30,20 +23,20 @@ impl PhysicsHooks<RigidBodySet, ColliderSet> for OneWayPlatformHook {
|
|||||||
// - If context.collider2 == self.platform1 then the allowed normal is -y.
|
// - If context.collider2 == self.platform1 then the allowed normal is -y.
|
||||||
// - If context.collider1 == self.platform2 then its allowed normal +y needs to be flipped to -y.
|
// - If context.collider1 == self.platform2 then its allowed normal +y needs to be flipped to -y.
|
||||||
// - If context.collider2 == self.platform2 then the allowed normal -y needs to be flipped to +y.
|
// - If context.collider2 == self.platform2 then the allowed normal -y needs to be flipped to +y.
|
||||||
let mut allowed_local_n1 = Vector3::zeros();
|
let mut allowed_local_n1 = Vector::zeros();
|
||||||
|
|
||||||
if context.collider1 == self.platform1 {
|
if context.collider1 == self.platform1 {
|
||||||
allowed_local_n1 = Vector3::y();
|
allowed_local_n1 = Vector::y();
|
||||||
} else if context.collider2 == self.platform1 {
|
} else if context.collider2 == self.platform1 {
|
||||||
// Flip the allowed direction.
|
// Flip the allowed direction.
|
||||||
allowed_local_n1 = -Vector3::y();
|
allowed_local_n1 = -Vector::y();
|
||||||
}
|
}
|
||||||
|
|
||||||
if context.collider1 == self.platform2 {
|
if context.collider1 == self.platform2 {
|
||||||
allowed_local_n1 = -Vector3::y();
|
allowed_local_n1 = -Vector::y();
|
||||||
} else if context.collider2 == self.platform2 {
|
} else if context.collider2 == self.platform2 {
|
||||||
// Flip the allowed direction.
|
// Flip the allowed direction.
|
||||||
allowed_local_n1 = Vector3::y();
|
allowed_local_n1 = Vector::y();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the helper function that simulates one-way platforms.
|
// Call the helper function that simulates one-way platforms.
|
||||||
@@ -78,15 +71,15 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let collider = ColliderBuilder::cuboid(9.0, 0.5, 25.0)
|
let collider = ColliderBuilder::cuboid(9.0, 0.5, 25.0)
|
||||||
.translation(0.0, 2.0, 30.0)
|
.translation(vector![0.0, 2.0, 30.0])
|
||||||
.modify_solver_contacts(true)
|
.active_hooks(ActiveHooks::MODIFY_SOLVER_CONTACTS)
|
||||||
.build();
|
.build();
|
||||||
let platform1 = colliders.insert(collider, handle, &mut bodies);
|
let platform1 = colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
let collider = ColliderBuilder::cuboid(9.0, 0.5, 25.0)
|
let collider = ColliderBuilder::cuboid(9.0, 0.5, 25.0)
|
||||||
.translation(0.0, -2.0, -30.0)
|
.translation(vector![0.0, -2.0, -30.0])
|
||||||
.modify_solver_contacts(true)
|
.active_hooks(ActiveHooks::MODIFY_SOLVER_CONTACTS)
|
||||||
.build();
|
.build();
|
||||||
let platform2 = colliders.insert(collider, handle, &mut bodies);
|
let platform2 = colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the one-way platform hook.
|
* Setup the one-way platform hook.
|
||||||
@@ -105,12 +98,12 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
// Spawn a new cube.
|
// Spawn a new cube.
|
||||||
let collider = ColliderBuilder::cuboid(1.0, 2.0, 1.5).build();
|
let collider = ColliderBuilder::cuboid(1.0, 2.0, 1.5).build();
|
||||||
let body = RigidBodyBuilder::new_dynamic()
|
let body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 6.0, 20.0)
|
.translation(vector![0.0, 6.0, 20.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = physics.bodies.insert(body);
|
let handle = physics.bodies.insert(body);
|
||||||
physics
|
physics
|
||||||
.colliders
|
.colliders
|
||||||
.insert(collider, handle, &mut physics.bodies);
|
.insert_with_parent(collider, handle, &mut physics.bodies);
|
||||||
|
|
||||||
if let Some(graphics) = graphics {
|
if let Some(graphics) = graphics {
|
||||||
graphics.add_body(handle, &physics.bodies, &physics.colliders);
|
graphics.add_body(handle, &physics.bodies, &physics.colliders);
|
||||||
@@ -134,8 +127,8 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
bodies,
|
bodies,
|
||||||
colliders,
|
colliders,
|
||||||
joints,
|
joints,
|
||||||
Vector3::new(0.0, -9.81, 0.0),
|
vector![0.0, -9.81, 0.0],
|
||||||
physics_hooks,
|
physics_hooks,
|
||||||
);
|
);
|
||||||
testbed.look_at(Point3::new(-100.0, 0.0, 0.0), Point3::origin());
|
testbed.look_at(point![-100.0, 0.0, 0.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the boxes
|
* Create the boxes
|
||||||
@@ -43,23 +41,35 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shift - centerz;
|
let z = k as f32 * shift - centerz;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup a kinematic rigid body.
|
* Setup a velocity-based kinematic rigid body.
|
||||||
*/
|
*/
|
||||||
let platform_body = RigidBodyBuilder::new_kinematic()
|
let platform_body = RigidBodyBuilder::new_kinematic_velocity_based()
|
||||||
.translation(0.0, 1.5 + 0.8, -10.0 * rad)
|
.translation(vector![0.0, 1.5 + 0.8, -10.0 * rad])
|
||||||
.build();
|
.build();
|
||||||
let platform_handle = bodies.insert(platform_body);
|
let velocity_based_platform_handle = bodies.insert(platform_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad * 10.0, rad, rad * 10.0).build();
|
let collider = ColliderBuilder::cuboid(rad * 10.0, rad, rad * 10.0).build();
|
||||||
colliders.insert(collider, platform_handle, &mut bodies);
|
colliders.insert_with_parent(collider, velocity_based_platform_handle, &mut bodies);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup a position-based kinematic rigid body.
|
||||||
|
*/
|
||||||
|
let platform_body = RigidBodyBuilder::new_kinematic_position_based()
|
||||||
|
.translation(vector![0.0, 2.0 + 1.5 + 0.8, -10.0 * rad])
|
||||||
|
.build();
|
||||||
|
let position_based_platform_handle = bodies.insert(platform_body);
|
||||||
|
let collider = ColliderBuilder::cuboid(rad * 10.0, rad, rad * 10.0).build();
|
||||||
|
colliders.insert_with_parent(collider, position_based_platform_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup a callback to control the platform.
|
* Setup a callback to control the platform.
|
||||||
@@ -71,21 +81,22 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(platform) = physics.bodies.get_mut(platform_handle) {
|
let velocity = vector![
|
||||||
let mut next_pos = *platform.position();
|
0.0,
|
||||||
|
(run_state.time * 5.0).sin(),
|
||||||
|
run_state.time.sin() * 5.0
|
||||||
|
];
|
||||||
|
|
||||||
let dt = 0.016;
|
// Update the velocity-based kinematic body by setting its velocity.
|
||||||
next_pos.translation.vector.y += (run_state.time * 5.0).sin() * dt;
|
if let Some(platform) = physics.bodies.get_mut(velocity_based_platform_handle) {
|
||||||
next_pos.translation.vector.z += run_state.time.sin() * 5.0 * dt;
|
platform.set_linvel(velocity, true);
|
||||||
|
}
|
||||||
|
|
||||||
if next_pos.translation.vector.z >= rad * 10.0 {
|
// Update the position-based kinematic body by setting its next position.
|
||||||
next_pos.translation.vector.z -= dt;
|
if let Some(platform) = physics.bodies.get_mut(position_based_platform_handle) {
|
||||||
}
|
let mut next_tra = *platform.translation();
|
||||||
if next_pos.translation.vector.z <= -rad * 10.0 {
|
next_tra += velocity * physics.integration_parameters.dt;
|
||||||
next_pos.translation.vector.z += dt;
|
platform.set_next_kinematic_translation(next_tra);
|
||||||
}
|
|
||||||
|
|
||||||
platform.set_next_kinematic_position(next_pos);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -93,5 +104,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Run the simulation.
|
* Run the simulation.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(-10.0, 5.0, -10.0), Point3::origin());
|
testbed.look_at(point![-10.0, 5.0, -10.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 2.1;
|
let ground_height = 2.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the primitives
|
* Create the primitives
|
||||||
@@ -47,7 +45,9 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shiftz - centerz + offset;
|
let z = k as f32 * shiftz - centerz + offset;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let collider = match j % 5 {
|
let collider = match j % 5 {
|
||||||
@@ -60,7 +60,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
_ => ColliderBuilder::capsule_y(rad, rad).build(),
|
_ => ColliderBuilder::capsule_y(rad, rad).build(),
|
||||||
};
|
};
|
||||||
|
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,5 +71,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,13 +16,13 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 1.0;
|
let ground_height = 1.0;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, 2.0)
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, 2.0)
|
||||||
.restitution(1.0)
|
.restitution(1.0)
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
let num = 10;
|
let num = 10;
|
||||||
let rad = 0.5;
|
let rad = 0.5;
|
||||||
@@ -33,13 +31,13 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
for i in 0..=num {
|
for i in 0..=num {
|
||||||
let x = (i as f32) - num as f32 / 2.0;
|
let x = (i as f32) - num as f32 / 2.0;
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic()
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(x * 2.0, 10.0 * (j as f32 + 1.0), 0.0)
|
.translation(vector![x * 2.0, 10.0 * (j as f32 + 1.0), 0.0])
|
||||||
.build();
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::ball(rad)
|
let collider = ColliderBuilder::ball(rad)
|
||||||
.restitution((i as f32) / (num as f32))
|
.restitution((i as f32) / (num as f32))
|
||||||
.build();
|
.build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,5 +45,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(0.0, 3.0, 30.0), Point3::new(0.0, 3.0, 0.0));
|
testbed.look_at(point![0.0, 3.0, 30.0], point![0.0, 3.0, 0.0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use na::Point3;
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -18,11 +16,11 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let ground_height = 0.1;
|
let ground_height = 0.1;
|
||||||
|
|
||||||
let rigid_body = RigidBodyBuilder::new_static()
|
let rigid_body = RigidBodyBuilder::new_static()
|
||||||
.translation(0.0, -ground_height, 0.0)
|
.translation(vector![0.0, -ground_height, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let ground_handle = bodies.insert(rigid_body);
|
let ground_handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build();
|
||||||
colliders.insert(collider, ground_handle, &mut bodies);
|
colliders.insert_with_parent(collider, ground_handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create some boxes.
|
* Create some boxes.
|
||||||
@@ -41,12 +39,14 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shift - centerz;
|
let z = k as f32 * shift - centerz;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_initial_body_color(handle, Point3::new(0.5, 0.5, 1.0));
|
testbed.set_initial_body_color(handle, [0.5, 0.5, 1.0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,33 +56,37 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
|
|
||||||
// Rigid body so that the sensor can move.
|
// Rigid body so that the sensor can move.
|
||||||
let sensor = RigidBodyBuilder::new_dynamic()
|
let sensor = RigidBodyBuilder::new_dynamic()
|
||||||
.translation(0.0, 5.0, 0.0)
|
.translation(vector![0.0, 5.0, 0.0])
|
||||||
.build();
|
.build();
|
||||||
let sensor_handle = bodies.insert(sensor);
|
let sensor_handle = bodies.insert(sensor);
|
||||||
|
|
||||||
// Solid cube attached to the sensor which
|
// Solid cube attached to the sensor which
|
||||||
// other colliders can touch.
|
// other colliders can touch.
|
||||||
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
let collider = ColliderBuilder::cuboid(rad, rad, rad).build();
|
||||||
colliders.insert(collider, sensor_handle, &mut bodies);
|
colliders.insert_with_parent(collider, sensor_handle, &mut bodies);
|
||||||
|
|
||||||
// We create a collider desc without density because we don't
|
// We create a collider desc without density because we don't
|
||||||
// want it to contribute to the rigid body mass.
|
// want it to contribute to the rigid body mass.
|
||||||
let sensor_collider = ColliderBuilder::ball(rad * 5.0).sensor(true).build();
|
let sensor_collider = ColliderBuilder::ball(rad * 5.0)
|
||||||
colliders.insert(sensor_collider, sensor_handle, &mut bodies);
|
.density(0.0)
|
||||||
|
.sensor(true)
|
||||||
|
.active_events(ActiveEvents::INTERSECTION_EVENTS)
|
||||||
|
.build();
|
||||||
|
colliders.insert_with_parent(sensor_collider, sensor_handle, &mut bodies);
|
||||||
|
|
||||||
testbed.set_initial_body_color(sensor_handle, Point3::new(0.5, 1.0, 1.0));
|
testbed.set_initial_body_color(sensor_handle, [0.5, 1.0, 1.0]);
|
||||||
|
|
||||||
// Callback that will be executed on the main loop to handle proximities.
|
// Callback that will be executed on the main loop to handle proximities.
|
||||||
testbed.add_callback(move |mut graphics, physics, events, _| {
|
testbed.add_callback(move |mut graphics, physics, events, _| {
|
||||||
while let Ok(prox) = events.intersection_events.try_recv() {
|
while let Ok(prox) = events.intersection_events.try_recv() {
|
||||||
let color = if prox.intersecting {
|
let color = if prox.intersecting {
|
||||||
Point3::new(1.0, 1.0, 0.0)
|
[1.0, 1.0, 0.0]
|
||||||
} else {
|
} else {
|
||||||
Point3::new(0.5, 0.5, 1.0)
|
[0.5, 0.5, 1.0]
|
||||||
};
|
};
|
||||||
|
|
||||||
let parent_handle1 = physics.colliders.get(prox.collider1).unwrap().parent();
|
let parent_handle1 = physics.colliders[prox.collider1].parent().unwrap();
|
||||||
let parent_handle2 = physics.colliders.get(prox.collider2).unwrap().parent();
|
let parent_handle2 = physics.colliders[prox.collider2].parent().unwrap();
|
||||||
|
|
||||||
if let Some(graphics) = &mut graphics {
|
if let Some(graphics) = &mut graphics {
|
||||||
if parent_handle1 != ground_handle && parent_handle1 != sensor_handle {
|
if parent_handle1 != ground_handle && parent_handle1 != sensor_handle {
|
||||||
@@ -99,5 +103,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(-6.0, 4.0, -6.0), Point3::new(0.0, 1.0, 0.0));
|
testbed.look_at(point![-6.0, 4.0, -6.0], point![0.0, 1.0, 0.0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use na::{ComplexField, DMatrix, Isometry3, Point3, Vector3};
|
use na::ComplexField;
|
||||||
use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
|
use rapier3d::prelude::*;
|
||||||
use rapier3d::geometry::{ColliderBuilder, ColliderSet, HeightField, SharedShape};
|
|
||||||
use rapier_testbed3d::Testbed;
|
use rapier_testbed3d::Testbed;
|
||||||
|
|
||||||
pub fn init_world(testbed: &mut Testbed) {
|
pub fn init_world(testbed: &mut Testbed) {
|
||||||
@@ -14,7 +13,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
/*
|
/*
|
||||||
* Ground
|
* Ground
|
||||||
*/
|
*/
|
||||||
let ground_size = Vector3::new(100.0, 1.0, 100.0);
|
let ground_size = vector![100.0, 1.0, 100.0];
|
||||||
let nsubdivs = 20;
|
let nsubdivs = 20;
|
||||||
|
|
||||||
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
let heights = DMatrix::from_fn(nsubdivs + 1, nsubdivs + 1, |i, j| {
|
||||||
@@ -39,7 +38,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let rigid_body = RigidBodyBuilder::new_static().build();
|
let rigid_body = RigidBodyBuilder::new_static().build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
let collider = ColliderBuilder::trimesh(vertices, indices).build();
|
let collider = ColliderBuilder::trimesh(vertices, indices).build();
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the cubes
|
* Create the cubes
|
||||||
@@ -60,7 +59,9 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
let z = k as f32 * shift - centerz;
|
let z = k as f32 * shift - centerz;
|
||||||
|
|
||||||
// Build the rigid body.
|
// Build the rigid body.
|
||||||
let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
|
let rigid_body = RigidBodyBuilder::new_dynamic()
|
||||||
|
.translation(vector![x, y, z])
|
||||||
|
.build();
|
||||||
let handle = bodies.insert(rigid_body);
|
let handle = bodies.insert(rigid_body);
|
||||||
|
|
||||||
let collider = match j % 6 {
|
let collider = match j % 6 {
|
||||||
@@ -74,15 +75,15 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
_ => {
|
_ => {
|
||||||
let shapes = vec![
|
let shapes = vec![
|
||||||
(
|
(
|
||||||
Isometry3::identity(),
|
Isometry::identity(),
|
||||||
SharedShape::cuboid(rad, rad / 2.0, rad / 2.0),
|
SharedShape::cuboid(rad, rad / 2.0, rad / 2.0),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
Isometry3::translation(rad, 0.0, 0.0),
|
Isometry::translation(rad, 0.0, 0.0),
|
||||||
SharedShape::cuboid(rad / 2.0, rad, rad / 2.0),
|
SharedShape::cuboid(rad / 2.0, rad, rad / 2.0),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
Isometry3::translation(-rad, 0.0, 0.0),
|
Isometry::translation(-rad, 0.0, 0.0),
|
||||||
SharedShape::cuboid(rad / 2.0, rad, rad / 2.0),
|
SharedShape::cuboid(rad / 2.0, rad, rad / 2.0),
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
@@ -91,7 +92,7 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
colliders.insert(collider, handle, &mut bodies);
|
colliders.insert_with_parent(collider, handle, &mut bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,5 +101,5 @@ pub fn init_world(testbed: &mut Testbed) {
|
|||||||
* Set up the testbed.
|
* Set up the testbed.
|
||||||
*/
|
*/
|
||||||
testbed.set_world(bodies, colliders, joints);
|
testbed.set_world(bodies, colliders, joints);
|
||||||
testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin());
|
testbed.look_at(point![100.0, 100.0, 100.0], Point::origin());
|
||||||
}
|
}
|
||||||
|
|||||||
35
publish.sh
Executable file
35
publish.sh
Executable file
@@ -0,0 +1,35 @@
|
|||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
tmp=$(mktemp -d)
|
||||||
|
|
||||||
|
echo "$tmp"
|
||||||
|
|
||||||
|
cp -r src "$tmp"/.
|
||||||
|
cp -r LICENSE README.md "$tmp"/.
|
||||||
|
|
||||||
|
### Publish the 2D version.
|
||||||
|
sed 's#\.\./\.\./src#src#g' build/rapier2d/Cargo.toml > "$tmp"/Cargo.toml
|
||||||
|
currdir=$(pwd)
|
||||||
|
cd "$tmp" && cargo publish
|
||||||
|
cd "$currdir" || exit
|
||||||
|
|
||||||
|
|
||||||
|
### Publish the 3D version.
|
||||||
|
sed 's#\.\./\.\./src#src#g' build/rapier3d/Cargo.toml > "$tmp"/Cargo.toml
|
||||||
|
cp -r LICENSE README.md "$tmp"/.
|
||||||
|
cd "$tmp" && cargo publish
|
||||||
|
cd "$currdir" || exit
|
||||||
|
|
||||||
|
### Publish the 2D f64 version.
|
||||||
|
sed 's#\.\./\.\./src#src#g' build/rapier2d-f64/Cargo.toml > "$tmp"/Cargo.toml
|
||||||
|
currdir=$(pwd)
|
||||||
|
cd "$tmp" && cargo publish
|
||||||
|
cd "$currdir" || exit
|
||||||
|
|
||||||
|
|
||||||
|
### Publish the 3D f64 version.
|
||||||
|
sed 's#\.\./\.\./src#src#g' build/rapier3d-f64/Cargo.toml > "$tmp"/Cargo.toml
|
||||||
|
cp -r LICENSE README.md "$tmp"/.
|
||||||
|
cd "$tmp" && cargo publish
|
||||||
|
|
||||||
|
rm -rf "$tmp"
|
||||||
@@ -13,6 +13,14 @@ impl<T> Coarena<T> {
|
|||||||
Self { data: Vec::new() }
|
Self { data: Vec::new() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets a specific element from the coarena without specifying its generation number.
|
||||||
|
///
|
||||||
|
/// It is strongly encouraged to use `Coarena::get` instead of this method because this method
|
||||||
|
/// can suffer from the ABA problem.
|
||||||
|
pub fn get_unknown_gen(&self, index: u32) -> Option<&T> {
|
||||||
|
self.data.get(index as usize).map(|(_, t)| t)
|
||||||
|
}
|
||||||
|
|
||||||
/// Gets a specific element from the coarena, if it exists.
|
/// Gets a specific element from the coarena, if it exists.
|
||||||
pub fn get(&self, index: Index) -> Option<&T> {
|
pub fn get(&self, index: Index) -> Option<&T> {
|
||||||
let (i, g) = index.into_raw_parts();
|
let (i, g) = index.into_raw_parts();
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use crate::geometry::{
|
|||||||
use crate::math::Real;
|
use crate::math::Real;
|
||||||
use crate::parry::utils::SortedPair;
|
use crate::parry::utils::SortedPair;
|
||||||
use crate::pipeline::{EventHandler, QueryPipeline, QueryPipelineMode};
|
use crate::pipeline::{EventHandler, QueryPipeline, QueryPipelineMode};
|
||||||
|
use crate::prelude::{ActiveEvents, ColliderFlags};
|
||||||
use parry::query::{DefaultQueryDispatcher, QueryDispatcher};
|
use parry::query::{DefaultQueryDispatcher, QueryDispatcher};
|
||||||
use parry::utils::hashmap::HashMap;
|
use parry::utils::hashmap::HashMap;
|
||||||
use std::collections::BinaryHeap;
|
use std::collections::BinaryHeap;
|
||||||
@@ -66,7 +67,7 @@ impl CCDSolver {
|
|||||||
&RigidBodyCcd,
|
&RigidBodyCcd,
|
||||||
&RigidBodyMassProps,
|
&RigidBodyMassProps,
|
||||||
) = bodies.index_bundle(handle.0);
|
) = bodies.index_bundle(handle.0);
|
||||||
let local_com = &mprops.mass_properties.local_com;
|
let local_com = &mprops.local_mprops.local_com;
|
||||||
|
|
||||||
let min_toi = (ccd.ccd_thickness
|
let min_toi = (ccd.ccd_thickness
|
||||||
* 0.15
|
* 0.15
|
||||||
@@ -139,7 +140,8 @@ impl CCDSolver {
|
|||||||
Colliders: ComponentSetOption<ColliderParent>
|
Colliders: ComponentSetOption<ColliderParent>
|
||||||
+ ComponentSet<ColliderPosition>
|
+ ComponentSet<ColliderPosition>
|
||||||
+ ComponentSet<ColliderShape>
|
+ ComponentSet<ColliderShape>
|
||||||
+ ComponentSet<ColliderType>,
|
+ ComponentSet<ColliderType>
|
||||||
|
+ ComponentSet<ColliderFlags>,
|
||||||
{
|
{
|
||||||
// Update the query pipeline.
|
// Update the query pipeline.
|
||||||
self.query_pipeline.update_with_mode(
|
self.query_pipeline.update_with_mode(
|
||||||
@@ -200,16 +202,21 @@ impl CCDSolver {
|
|||||||
{
|
{
|
||||||
let co_parent1: Option<&ColliderParent> = colliders.get(ch1.0);
|
let co_parent1: Option<&ColliderParent> = colliders.get(ch1.0);
|
||||||
let co_parent2: Option<&ColliderParent> = colliders.get(ch2.0);
|
let co_parent2: Option<&ColliderParent> = colliders.get(ch2.0);
|
||||||
let c1: (_, _, _) = colliders.index_bundle(ch1.0);
|
let c1: (_, _, _, &ColliderFlags) = colliders.index_bundle(ch1.0);
|
||||||
let c2: (_, _, _) = colliders.index_bundle(ch2.0);
|
let c2: (_, _, _, &ColliderFlags) = colliders.index_bundle(ch2.0);
|
||||||
let co_type1: &ColliderType = colliders.index(ch1.0);
|
let co_type1: &ColliderType = colliders.index(ch1.0);
|
||||||
let co_type2: &ColliderType = colliders.index(ch1.0);
|
let co_type2: &ColliderType = colliders.index(ch1.0);
|
||||||
|
|
||||||
let bh1 = co_parent1.map(|p| p.handle);
|
let bh1 = co_parent1.map(|p| p.handle);
|
||||||
let bh2 = co_parent2.map(|p| p.handle);
|
let bh2 = co_parent2.map(|p| p.handle);
|
||||||
|
|
||||||
if bh1 == bh2 || (co_type1.is_sensor() || co_type2.is_sensor()) {
|
// Ignore self-intersection and sensors and apply collision groups filter.
|
||||||
// Ignore self-intersection and sensors.
|
if bh1 == bh2 // Ignore self-intersection.
|
||||||
|
|| (co_type1.is_sensor() || co_type2.is_sensor()) // Ignore sensors.
|
||||||
|
|| !c1.3.collision_groups.test(c2.3.collision_groups) // Apply collision groups.
|
||||||
|
|| !c1.3.solver_groups.test(c2.3.solver_groups)
|
||||||
|
// Apply solver groups.
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -225,8 +232,8 @@ impl CCDSolver {
|
|||||||
self.query_pipeline.query_dispatcher(),
|
self.query_pipeline.query_dispatcher(),
|
||||||
*ch1,
|
*ch1,
|
||||||
*ch2,
|
*ch2,
|
||||||
(c1.0, c1.1, c1.2, co_parent1),
|
(c1.0, c1.1, c1.2, c1.3, co_parent1),
|
||||||
(c2.0, c2.1, c2.2, co_parent2),
|
(c2.0, c2.1, c2.2, c2.3, co_parent2),
|
||||||
Some((rb_pos1, rb_vels1, rb_mprops1, rb_ccd1)),
|
Some((rb_pos1, rb_vels1, rb_mprops1, rb_ccd1)),
|
||||||
b2,
|
b2,
|
||||||
None,
|
None,
|
||||||
@@ -272,7 +279,9 @@ impl CCDSolver {
|
|||||||
Colliders: ComponentSetOption<ColliderParent>
|
Colliders: ComponentSetOption<ColliderParent>
|
||||||
+ ComponentSet<ColliderPosition>
|
+ ComponentSet<ColliderPosition>
|
||||||
+ ComponentSet<ColliderShape>
|
+ ComponentSet<ColliderShape>
|
||||||
+ ComponentSet<ColliderType>,
|
+ ComponentSet<ColliderType>
|
||||||
|
+ ComponentSet<ColliderFlags>
|
||||||
|
+ ComponentSet<ColliderFlags>,
|
||||||
{
|
{
|
||||||
let mut frozen = HashMap::<_, Real>::default();
|
let mut frozen = HashMap::<_, Real>::default();
|
||||||
let mut all_toi = BinaryHeap::new();
|
let mut all_toi = BinaryHeap::new();
|
||||||
@@ -334,14 +343,15 @@ impl CCDSolver {
|
|||||||
{
|
{
|
||||||
let co_parent1: Option<&ColliderParent> = colliders.get(ch1.0);
|
let co_parent1: Option<&ColliderParent> = colliders.get(ch1.0);
|
||||||
let co_parent2: Option<&ColliderParent> = colliders.get(ch2.0);
|
let co_parent2: Option<&ColliderParent> = colliders.get(ch2.0);
|
||||||
let c1: (_, _, _) = colliders.index_bundle(ch1.0);
|
let c1: (_, _, _, &ColliderFlags) = colliders.index_bundle(ch1.0);
|
||||||
let c2: (_, _, _) = colliders.index_bundle(ch2.0);
|
let c2: (_, _, _, &ColliderFlags) = colliders.index_bundle(ch2.0);
|
||||||
|
|
||||||
let bh1 = co_parent1.map(|p| p.handle);
|
let bh1 = co_parent1.map(|p| p.handle);
|
||||||
let bh2 = co_parent2.map(|p| p.handle);
|
let bh2 = co_parent2.map(|p| p.handle);
|
||||||
|
|
||||||
if bh1 == bh2 {
|
// Ignore self-intersections and apply groups filter.
|
||||||
// Ignore self-intersection.
|
if bh1 == bh2 || !c1.3.collision_groups.test(c2.3.collision_groups)
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,8 +368,8 @@ impl CCDSolver {
|
|||||||
self.query_pipeline.query_dispatcher(),
|
self.query_pipeline.query_dispatcher(),
|
||||||
*ch1,
|
*ch1,
|
||||||
*ch2,
|
*ch2,
|
||||||
(c1.0, c1.1, c1.2, co_parent1),
|
(c1.0, c1.1, c1.2, c1.3, co_parent1),
|
||||||
(c2.0, c2.1, c2.2, co_parent2),
|
(c2.0, c2.1, c2.2, c2.3, co_parent2),
|
||||||
b1,
|
b1,
|
||||||
b2,
|
b2,
|
||||||
None,
|
None,
|
||||||
@@ -398,7 +408,7 @@ impl CCDSolver {
|
|||||||
|
|
||||||
// NOTE: all static bodies (and kinematic bodies?) should be considered as "frozen", this
|
// NOTE: all static bodies (and kinematic bodies?) should be considered as "frozen", this
|
||||||
// may avoid some resweeps.
|
// may avoid some resweeps.
|
||||||
let mut intersections_to_check = vec![];
|
let mut pseudo_intersections_to_check = vec![];
|
||||||
|
|
||||||
while let Some(toi) = all_toi.pop() {
|
while let Some(toi) = all_toi.pop() {
|
||||||
assert!(toi.toi <= dt);
|
assert!(toi.toi <= dt);
|
||||||
@@ -420,7 +430,7 @@ impl CCDSolver {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if toi.is_intersection_test {
|
if toi.is_pseudo_intersection_test {
|
||||||
// NOTE: this test is redundant with the previous `if !should_freeze && ...`
|
// NOTE: this test is redundant with the previous `if !should_freeze && ...`
|
||||||
// but let's keep it to avoid tricky regressions if we end up swapping both
|
// but let's keep it to avoid tricky regressions if we end up swapping both
|
||||||
// `if` for some reasons in the future.
|
// `if` for some reasons in the future.
|
||||||
@@ -428,7 +438,7 @@ impl CCDSolver {
|
|||||||
// This is only an intersection so we don't have to freeze and there is no
|
// This is only an intersection so we don't have to freeze and there is no
|
||||||
// need to resweep. However we will need to see if we have to generate
|
// need to resweep. However we will need to see if we have to generate
|
||||||
// intersection events, so push the TOI for further testing.
|
// intersection events, so push the TOI for further testing.
|
||||||
intersections_to_check.push(toi);
|
pseudo_intersections_to_check.push(toi);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -460,14 +470,14 @@ impl CCDSolver {
|
|||||||
.colliders_with_aabb_intersecting_aabb(&aabb, |ch2| {
|
.colliders_with_aabb_intersecting_aabb(&aabb, |ch2| {
|
||||||
let co_parent1: Option<&ColliderParent> = colliders.get(ch1.0);
|
let co_parent1: Option<&ColliderParent> = colliders.get(ch1.0);
|
||||||
let co_parent2: Option<&ColliderParent> = colliders.get(ch2.0);
|
let co_parent2: Option<&ColliderParent> = colliders.get(ch2.0);
|
||||||
let c1: (_, _, _) = colliders.index_bundle(ch1.0);
|
let c1: (_, _, _, &ColliderFlags) = colliders.index_bundle(ch1.0);
|
||||||
let c2: (_, _, _) = colliders.index_bundle(ch2.0);
|
let c2: (_, _, _, &ColliderFlags) = colliders.index_bundle(ch2.0);
|
||||||
|
|
||||||
let bh1 = co_parent1.map(|p| p.handle);
|
let bh1 = co_parent1.map(|p| p.handle);
|
||||||
let bh2 = co_parent2.map(|p| p.handle);
|
let bh2 = co_parent2.map(|p| p.handle);
|
||||||
|
|
||||||
if bh1 == bh2 {
|
// Ignore self-intersection and apply groups filter.
|
||||||
// Ignore self-intersection.
|
if bh1 == bh2 || !c1.3.collision_groups.test(c2.3.collision_groups) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -496,8 +506,8 @@ impl CCDSolver {
|
|||||||
self.query_pipeline.query_dispatcher(),
|
self.query_pipeline.query_dispatcher(),
|
||||||
*ch1,
|
*ch1,
|
||||||
*ch2,
|
*ch2,
|
||||||
(c1.0, c1.1, c1.2, co_parent1),
|
(c1.0, c1.1, c1.2, c1.3, co_parent1),
|
||||||
(c2.0, c2.1, c2.2, co_parent2),
|
(c2.0, c2.1, c2.2, c2.3, co_parent2),
|
||||||
b1,
|
b1,
|
||||||
b2,
|
b2,
|
||||||
frozen1.copied(),
|
frozen1.copied(),
|
||||||
@@ -514,7 +524,7 @@ impl CCDSolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for toi in intersections_to_check {
|
for toi in pseudo_intersections_to_check {
|
||||||
// See if the intersection is still active once the bodies
|
// See if the intersection is still active once the bodies
|
||||||
// reach their final positions.
|
// reach their final positions.
|
||||||
// - If the intersection is still active, don't report it yet. It will be
|
// - If the intersection is still active, don't report it yet. It will be
|
||||||
@@ -522,10 +532,29 @@ impl CCDSolver {
|
|||||||
// - If the intersection isn't active anymore, and it wasn't intersecting
|
// - If the intersection isn't active anymore, and it wasn't intersecting
|
||||||
// before, then we need to generate one interaction-start and one interaction-stop
|
// before, then we need to generate one interaction-start and one interaction-stop
|
||||||
// events because it will never be detected by the narrow-phase because of tunneling.
|
// events because it will never be detected by the narrow-phase because of tunneling.
|
||||||
let (co_pos1, co_shape1): (&ColliderPosition, &ColliderShape) =
|
let (co_type1, co_pos1, co_shape1, co_flags1): (
|
||||||
colliders.index_bundle(toi.c1.0);
|
&ColliderType,
|
||||||
let (co_pos2, co_shape2): (&ColliderPosition, &ColliderShape) =
|
&ColliderPosition,
|
||||||
colliders.index_bundle(toi.c2.0);
|
&ColliderShape,
|
||||||
|
&ColliderFlags,
|
||||||
|
) = colliders.index_bundle(toi.c1.0);
|
||||||
|
let (co_type2, co_pos2, co_shape2, co_flags2): (
|
||||||
|
&ColliderType,
|
||||||
|
&ColliderPosition,
|
||||||
|
&ColliderShape,
|
||||||
|
&ColliderFlags,
|
||||||
|
) = colliders.index_bundle(toi.c2.0);
|
||||||
|
|
||||||
|
if !co_type1.is_sensor() && !co_type2.is_sensor() {
|
||||||
|
// TODO: this happens if we found a TOI between two non-sensor
|
||||||
|
// colliders with mismatching solver_flags. It is not clear
|
||||||
|
// what we should do in this case: we could report a
|
||||||
|
// contact started/contact stopped event for example. But in
|
||||||
|
// that case, what contact pair should be pass to these events?
|
||||||
|
// For now we just ignore this special case. Let's wait for an actual
|
||||||
|
// use-case to come up before we determine what we want to do here.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let co_next_pos1 = if let Some(b1) = toi.b1 {
|
let co_next_pos1 = if let Some(b1) = toi.b1 {
|
||||||
let co_parent1: &ColliderParent = colliders.get(toi.c1.0).unwrap();
|
let co_parent1: &ColliderParent = colliders.get(toi.c1.0).unwrap();
|
||||||
@@ -535,7 +564,7 @@ impl CCDSolver {
|
|||||||
&RigidBodyMassProps,
|
&RigidBodyMassProps,
|
||||||
) = bodies.index_bundle(b1.0);
|
) = bodies.index_bundle(b1.0);
|
||||||
|
|
||||||
let local_com1 = &rb_mprops1.mass_properties.local_com;
|
let local_com1 = &rb_mprops1.local_mprops.local_com;
|
||||||
let frozen1 = frozen.get(&b1);
|
let frozen1 = frozen.get(&b1);
|
||||||
let pos1 = frozen1
|
let pos1 = frozen1
|
||||||
.map(|t| rb_vels1.integrate(*t, &rb_pos1.position, local_com1))
|
.map(|t| rb_vels1.integrate(*t, &rb_pos1.position, local_com1))
|
||||||
@@ -553,7 +582,7 @@ impl CCDSolver {
|
|||||||
&RigidBodyMassProps,
|
&RigidBodyMassProps,
|
||||||
) = bodies.index_bundle(b2.0);
|
) = bodies.index_bundle(b2.0);
|
||||||
|
|
||||||
let local_com2 = &rb_mprops2.mass_properties.local_com;
|
let local_com2 = &rb_mprops2.local_mprops.local_com;
|
||||||
let frozen2 = frozen.get(&b2);
|
let frozen2 = frozen.get(&b2);
|
||||||
let pos2 = frozen2
|
let pos2 = frozen2
|
||||||
.map(|t| rb_vels2.integrate(*t, &rb_pos2.position, local_com2))
|
.map(|t| rb_vels2.integrate(*t, &rb_pos2.position, local_com2))
|
||||||
@@ -575,7 +604,11 @@ impl CCDSolver {
|
|||||||
.intersection_test(&next_coll_pos12, co_shape1.as_ref(), co_shape2.as_ref())
|
.intersection_test(&next_coll_pos12, co_shape1.as_ref(), co_shape2.as_ref())
|
||||||
.unwrap_or(false);
|
.unwrap_or(false);
|
||||||
|
|
||||||
if !intersect_before && !intersect_after {
|
if !intersect_before
|
||||||
|
&& !intersect_after
|
||||||
|
&& (co_flags1.active_events | co_flags2.active_events)
|
||||||
|
.contains(ActiveEvents::INTERSECTION_EVENTS)
|
||||||
|
{
|
||||||
// Emit one intersection-started and one intersection-stopped event.
|
// Emit one intersection-started and one intersection-stopped event.
|
||||||
events.handle_intersection_event(IntersectionEvent::new(toi.c1, toi.c2, true));
|
events.handle_intersection_event(IntersectionEvent::new(toi.c1, toi.c2, true));
|
||||||
events.handle_intersection_event(IntersectionEvent::new(toi.c1, toi.c2, false));
|
events.handle_intersection_event(IntersectionEvent::new(toi.c1, toi.c2, false));
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use crate::dynamics::{
|
|||||||
RigidBodyCcd, RigidBodyHandle, RigidBodyMassProps, RigidBodyPosition, RigidBodyVelocity,
|
RigidBodyCcd, RigidBodyHandle, RigidBodyMassProps, RigidBodyPosition, RigidBodyVelocity,
|
||||||
};
|
};
|
||||||
use crate::geometry::{
|
use crate::geometry::{
|
||||||
ColliderHandle, ColliderParent, ColliderPosition, ColliderShape, ColliderType,
|
ColliderFlags, ColliderHandle, ColliderParent, ColliderPosition, ColliderShape, ColliderType,
|
||||||
};
|
};
|
||||||
use crate::math::Real;
|
use crate::math::Real;
|
||||||
use parry::query::{NonlinearRigidMotion, QueryDispatcher};
|
use parry::query::{NonlinearRigidMotion, QueryDispatcher};
|
||||||
@@ -14,7 +14,9 @@ pub struct TOIEntry {
|
|||||||
pub b1: Option<RigidBodyHandle>,
|
pub b1: Option<RigidBodyHandle>,
|
||||||
pub c2: ColliderHandle,
|
pub c2: ColliderHandle,
|
||||||
pub b2: Option<RigidBodyHandle>,
|
pub b2: Option<RigidBodyHandle>,
|
||||||
pub is_intersection_test: bool,
|
// We call this "pseudo" intersection because this also
|
||||||
|
// includes colliders pairs with mismatching solver_groups.
|
||||||
|
pub is_pseudo_intersection_test: bool,
|
||||||
pub timestamp: usize,
|
pub timestamp: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,7 +27,7 @@ impl TOIEntry {
|
|||||||
b1: Option<RigidBodyHandle>,
|
b1: Option<RigidBodyHandle>,
|
||||||
c2: ColliderHandle,
|
c2: ColliderHandle,
|
||||||
b2: Option<RigidBodyHandle>,
|
b2: Option<RigidBodyHandle>,
|
||||||
is_intersection_test: bool,
|
is_pseudo_intersection_test: bool,
|
||||||
timestamp: usize,
|
timestamp: usize,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@@ -34,7 +36,7 @@ impl TOIEntry {
|
|||||||
b1,
|
b1,
|
||||||
c2,
|
c2,
|
||||||
b2,
|
b2,
|
||||||
is_intersection_test,
|
is_pseudo_intersection_test,
|
||||||
timestamp,
|
timestamp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,12 +49,14 @@ impl TOIEntry {
|
|||||||
&ColliderType,
|
&ColliderType,
|
||||||
&ColliderShape,
|
&ColliderShape,
|
||||||
&ColliderPosition,
|
&ColliderPosition,
|
||||||
|
&ColliderFlags,
|
||||||
Option<&ColliderParent>,
|
Option<&ColliderParent>,
|
||||||
),
|
),
|
||||||
c2: (
|
c2: (
|
||||||
&ColliderType,
|
&ColliderType,
|
||||||
&ColliderShape,
|
&ColliderShape,
|
||||||
&ColliderPosition,
|
&ColliderPosition,
|
||||||
|
&ColliderFlags,
|
||||||
Option<&ColliderParent>,
|
Option<&ColliderParent>,
|
||||||
),
|
),
|
||||||
b1: Option<(
|
b1: Option<(
|
||||||
@@ -78,8 +82,8 @@ impl TOIEntry {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let (co_type1, co_shape1, co_pos1, co_parent1) = c1;
|
let (co_type1, co_shape1, co_pos1, co_flags1, co_parent1) = c1;
|
||||||
let (co_type2, co_shape2, co_pos2, co_parent2) = c2;
|
let (co_type2, co_shape2, co_pos2, co_flags2, co_parent2) = c2;
|
||||||
|
|
||||||
let linvel1 =
|
let linvel1 =
|
||||||
frozen1.is_none() as u32 as Real * b1.map(|b| b.1.linvel).unwrap_or(na::zero());
|
frozen1.is_none() as u32 as Real * b1.map(|b| b.1.linvel).unwrap_or(na::zero());
|
||||||
@@ -104,7 +108,9 @@ impl TOIEntry {
|
|||||||
// keep it since more conservatism is good at this stage.
|
// keep it since more conservatism is good at this stage.
|
||||||
let thickness = (co_shape1.0.ccd_thickness() + co_shape2.0.ccd_thickness())
|
let thickness = (co_shape1.0.ccd_thickness() + co_shape2.0.ccd_thickness())
|
||||||
+ smallest_contact_dist.max(0.0);
|
+ smallest_contact_dist.max(0.0);
|
||||||
let is_intersection_test = co_type1.is_sensor() || co_type2.is_sensor();
|
let is_pseudo_intersection_test = co_type1.is_sensor()
|
||||||
|
|| co_type2.is_sensor()
|
||||||
|
|| !co_flags1.solver_groups.test(co_flags2.solver_groups);
|
||||||
|
|
||||||
if (end_time - start_time) * vel12 < thickness {
|
if (end_time - start_time) * vel12 < thickness {
|
||||||
return None;
|
return None;
|
||||||
@@ -135,7 +141,7 @@ impl TOIEntry {
|
|||||||
// If the TOI search involves two non-sensor colliders then
|
// If the TOI search involves two non-sensor colliders then
|
||||||
// we don't want to stop the TOI search at the first penetration
|
// we don't want to stop the TOI search at the first penetration
|
||||||
// because the colliders may be in a separating trajectory.
|
// because the colliders may be in a separating trajectory.
|
||||||
let stop_at_penetration = is_intersection_test;
|
let stop_at_penetration = is_pseudo_intersection_test;
|
||||||
|
|
||||||
let res_toi = query_dispatcher
|
let res_toi = query_dispatcher
|
||||||
.nonlinear_time_of_impact(
|
.nonlinear_time_of_impact(
|
||||||
@@ -157,7 +163,7 @@ impl TOIEntry {
|
|||||||
co_parent1.map(|p| p.handle),
|
co_parent1.map(|p| p.handle),
|
||||||
ch2,
|
ch2,
|
||||||
co_parent2.map(|p| p.handle),
|
co_parent2.map(|p| p.handle),
|
||||||
is_intersection_test,
|
is_pseudo_intersection_test,
|
||||||
0,
|
0,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
@@ -173,7 +179,7 @@ impl TOIEntry {
|
|||||||
if ccd.ccd_active {
|
if ccd.ccd_active {
|
||||||
NonlinearRigidMotion::new(
|
NonlinearRigidMotion::new(
|
||||||
poss.position,
|
poss.position,
|
||||||
mprops.mass_properties.local_com,
|
mprops.local_mprops.local_com,
|
||||||
vels.linvel,
|
vels.linvel,
|
||||||
vels.angvel,
|
vels.angvel,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ pub struct IntegrationParameters {
|
|||||||
///
|
///
|
||||||
/// When CCD with multiple substeps is enabled, the timestep is subdivided
|
/// When CCD with multiple substeps is enabled, the timestep is subdivided
|
||||||
/// into smaller pieces. This timestep subdivision won't generate timestep
|
/// into smaller pieces. This timestep subdivision won't generate timestep
|
||||||
/// lengths smaller than `min_dt`.
|
/// lengths smaller than `min_ccd_dt`.
|
||||||
///
|
///
|
||||||
/// Setting this to a large value will reduce the opportunity to performing
|
/// Setting this to a large value will reduce the opportunity to performing
|
||||||
/// CCD substepping, resulting in potentially more time dropped by the
|
/// CCD substepping, resulting in potentially more time dropped by the
|
||||||
@@ -18,17 +18,6 @@ pub struct IntegrationParameters {
|
|||||||
/// to numerical instabilities.
|
/// to numerical instabilities.
|
||||||
pub min_ccd_dt: Real,
|
pub min_ccd_dt: Real,
|
||||||
|
|
||||||
// /// If `true` and if rapier is compiled with the `parallel` feature, this will enable rayon-based multithreading (default: `true`).
|
|
||||||
// ///
|
|
||||||
// /// This parameter is ignored if rapier is not compiled with is `parallel` feature.
|
|
||||||
// /// Refer to rayon's documentation regarding how to configure the number of threads with either
|
|
||||||
// /// `rayon::ThreadPoolBuilder::new().num_threads(4).build_global().unwrap()` or `ThreadPool::install`.
|
|
||||||
// /// Note that using only one thread with `multithreading_enabled` set to `true` will result on a slower
|
|
||||||
// /// simulation than setting `multithreading_enabled` to `false`.
|
|
||||||
// pub multithreading_enabled: bool,
|
|
||||||
// /// If `true`, the world's `step` method will stop right after resolving exactly one CCD event (default: `false`).
|
|
||||||
// /// This allows the user to take action during a timestep, in-between two CCD events.
|
|
||||||
// pub return_after_ccd_substep: bool,
|
|
||||||
/// The Error Reduction Parameter in `[0, 1]` is the proportion of
|
/// The Error Reduction Parameter in `[0, 1]` is the proportion of
|
||||||
/// the positional error to be corrected at each time step (default: `0.2`).
|
/// the positional error to be corrected at each time step (default: `0.2`).
|
||||||
pub erp: Real,
|
pub erp: Real,
|
||||||
|
|||||||
@@ -229,19 +229,17 @@ impl IslandManager {
|
|||||||
stack: &mut Vec<RigidBodyHandle>,
|
stack: &mut Vec<RigidBodyHandle>,
|
||||||
) {
|
) {
|
||||||
for collider_handle in &rb_colliders.0 {
|
for collider_handle in &rb_colliders.0 {
|
||||||
if let Some(contacts) = narrow_phase.contacts_with(*collider_handle) {
|
for inter in narrow_phase.contacts_with(*collider_handle) {
|
||||||
for inter in contacts {
|
for manifold in &inter.manifolds {
|
||||||
for manifold in &inter.2.manifolds {
|
if !manifold.data.solver_contacts.is_empty() {
|
||||||
if !manifold.data.solver_contacts.is_empty() {
|
let other = crate::utils::select_other(
|
||||||
let other = crate::utils::select_other(
|
(inter.collider1, inter.collider2),
|
||||||
(inter.0, inter.1),
|
*collider_handle,
|
||||||
*collider_handle,
|
);
|
||||||
);
|
if let Some(other_body) = colliders.get(other.0) {
|
||||||
if let Some(other_body) = colliders.get(other.0) {
|
stack.push(other_body.handle);
|
||||||
stack.push(other_body.handle);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ use crate::math::{Isometry, Real, SpacialVector};
|
|||||||
pub struct FixedJoint {
|
pub struct FixedJoint {
|
||||||
/// The frame of reference for the first body affected by this joint, expressed in the local frame
|
/// The frame of reference for the first body affected by this joint, expressed in the local frame
|
||||||
/// of the first body.
|
/// of the first body.
|
||||||
pub local_anchor1: Isometry<Real>,
|
pub local_frame1: Isometry<Real>,
|
||||||
/// The frame of reference for the second body affected by this joint, expressed in the local frame
|
/// The frame of reference for the second body affected by this joint, expressed in the local frame
|
||||||
/// of the first body.
|
/// of the first body.
|
||||||
pub local_anchor2: Isometry<Real>,
|
pub local_frame2: Isometry<Real>,
|
||||||
/// The impulse applied to the first body affected by this joint.
|
/// The impulse applied to the first body affected by this joint.
|
||||||
///
|
///
|
||||||
/// The impulse applied to the second body affected by this joint is given by `-impulse`.
|
/// The impulse applied to the second body affected by this joint is given by `-impulse`.
|
||||||
@@ -23,10 +23,10 @@ pub struct FixedJoint {
|
|||||||
|
|
||||||
impl FixedJoint {
|
impl FixedJoint {
|
||||||
/// Creates a new fixed joint from the frames of reference of both bodies.
|
/// Creates a new fixed joint from the frames of reference of both bodies.
|
||||||
pub fn new(local_anchor1: Isometry<Real>, local_anchor2: Isometry<Real>) -> Self {
|
pub fn new(local_frame1: Isometry<Real>, local_frame2: Isometry<Real>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
local_anchor1,
|
local_frame1,
|
||||||
local_anchor2,
|
local_frame2,
|
||||||
impulse: SpacialVector::zeros(),
|
impulse: SpacialVector::zeros(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ use crate::dynamics::{
|
|||||||
RigidBodyMassPropsFlags, RigidBodyPosition, RigidBodyType, RigidBodyVelocity,
|
RigidBodyMassPropsFlags, RigidBodyPosition, RigidBodyType, RigidBodyVelocity,
|
||||||
};
|
};
|
||||||
use crate::geometry::{
|
use crate::geometry::{
|
||||||
Collider, ColliderHandle, ColliderMassProperties, ColliderParent, ColliderPosition,
|
Collider, ColliderHandle, ColliderMassProps, ColliderParent, ColliderPosition, ColliderShape,
|
||||||
ColliderShape,
|
|
||||||
};
|
};
|
||||||
use crate::math::{AngVector, Isometry, Point, Real, Rotation, Vector};
|
use crate::math::{AngVector, Isometry, Point, Real, Rotation, Vector};
|
||||||
use crate::utils::{self, WCross};
|
use crate::utils::{self, WCross};
|
||||||
@@ -48,7 +47,7 @@ impl RigidBody {
|
|||||||
rb_ccd: RigidBodyCcd::default(),
|
rb_ccd: RigidBodyCcd::default(),
|
||||||
rb_ids: RigidBodyIds::default(),
|
rb_ids: RigidBodyIds::default(),
|
||||||
rb_colliders: RigidBodyColliders::default(),
|
rb_colliders: RigidBodyColliders::default(),
|
||||||
rb_activation: RigidBodyActivation::new_active(),
|
rb_activation: RigidBodyActivation::active(),
|
||||||
changes: RigidBodyChanges::all(),
|
changes: RigidBodyChanges::all(),
|
||||||
rb_type: RigidBodyType::Dynamic,
|
rb_type: RigidBodyType::Dynamic,
|
||||||
rb_dominance: RigidBodyDominance::default(),
|
rb_dominance: RigidBodyDominance::default(),
|
||||||
@@ -112,7 +111,7 @@ impl RigidBody {
|
|||||||
/// The mass properties of this rigid-body.
|
/// The mass properties of this rigid-body.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn mass_properties(&self) -> &MassProperties {
|
pub fn mass_properties(&self) -> &MassProperties {
|
||||||
&self.rb_mprops.mass_properties
|
&self.rb_mprops.local_mprops
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The dominance group of this rigid-body.
|
/// The dominance group of this rigid-body.
|
||||||
@@ -124,6 +123,72 @@ impl RigidBody {
|
|||||||
self.rb_dominance.effective_group(&self.rb_type)
|
self.rb_dominance.effective_group(&self.rb_type)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
/// Locks or unlocks all the rotations of this rigid-body.
|
||||||
|
pub fn lock_rotations(&mut self, locked: bool, wake_up: bool) {
|
||||||
|
if self.is_dynamic() {
|
||||||
|
if wake_up {
|
||||||
|
self.wake_up(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.rb_mprops
|
||||||
|
.flags
|
||||||
|
.set(RigidBodyMassPropsFlags::ROTATION_LOCKED_X, locked);
|
||||||
|
self.rb_mprops
|
||||||
|
.flags
|
||||||
|
.set(RigidBodyMassPropsFlags::ROTATION_LOCKED_Y, locked);
|
||||||
|
self.rb_mprops
|
||||||
|
.flags
|
||||||
|
.set(RigidBodyMassPropsFlags::ROTATION_LOCKED_Z, locked);
|
||||||
|
self.update_world_mass_properties();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
/// Locks or unlocks rotations of this rigid-body along each cartesian axes.
|
||||||
|
pub fn restrict_rotations(
|
||||||
|
&mut self,
|
||||||
|
allow_rotations_x: bool,
|
||||||
|
allow_rotations_y: bool,
|
||||||
|
allow_rotations_z: bool,
|
||||||
|
wake_up: bool,
|
||||||
|
) {
|
||||||
|
if self.is_dynamic() {
|
||||||
|
if wake_up {
|
||||||
|
self.wake_up(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.rb_mprops.flags.set(
|
||||||
|
RigidBodyMassPropsFlags::ROTATION_LOCKED_X,
|
||||||
|
allow_rotations_x,
|
||||||
|
);
|
||||||
|
self.rb_mprops.flags.set(
|
||||||
|
RigidBodyMassPropsFlags::ROTATION_LOCKED_Y,
|
||||||
|
allow_rotations_y,
|
||||||
|
);
|
||||||
|
self.rb_mprops.flags.set(
|
||||||
|
RigidBodyMassPropsFlags::ROTATION_LOCKED_Z,
|
||||||
|
allow_rotations_z,
|
||||||
|
);
|
||||||
|
self.update_world_mass_properties();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
/// Locks or unlocks all the rotations of this rigid-body.
|
||||||
|
pub fn lock_translations(&mut self, locked: bool, wake_up: bool) {
|
||||||
|
if self.is_dynamic() {
|
||||||
|
if wake_up {
|
||||||
|
self.wake_up(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.rb_mprops
|
||||||
|
.flags
|
||||||
|
.set(RigidBodyMassPropsFlags::TRANSLATION_LOCKED, locked);
|
||||||
|
self.update_world_mass_properties();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Are the translations of this rigid-body locked?
|
/// Are the translations of this rigid-body locked?
|
||||||
pub fn is_translation_locked(&self) -> bool {
|
pub fn is_translation_locked(&self) -> bool {
|
||||||
self.rb_mprops
|
self.rb_mprops
|
||||||
@@ -190,7 +255,7 @@ impl RigidBody {
|
|||||||
self.wake_up(true);
|
self.wake_up(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.rb_mprops.mass_properties = props;
|
self.rb_mprops.local_mprops = props;
|
||||||
self.update_world_mass_properties();
|
self.update_world_mass_properties();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,7 +275,7 @@ impl RigidBody {
|
|||||||
///
|
///
|
||||||
/// A kinematic body can move freely but is not affected by forces.
|
/// A kinematic body can move freely but is not affected by forces.
|
||||||
pub fn is_kinematic(&self) -> bool {
|
pub fn is_kinematic(&self) -> bool {
|
||||||
self.rb_type == RigidBodyType::Kinematic
|
self.rb_type.is_kinematic()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Is this rigid body static?
|
/// Is this rigid body static?
|
||||||
@@ -224,7 +289,7 @@ impl RigidBody {
|
|||||||
///
|
///
|
||||||
/// Returns zero if this rigid body has an infinite mass.
|
/// Returns zero if this rigid body has an infinite mass.
|
||||||
pub fn mass(&self) -> Real {
|
pub fn mass(&self) -> Real {
|
||||||
utils::inv(self.rb_mprops.mass_properties.inv_mass)
|
utils::inv(self.rb_mprops.local_mprops.inv_mass)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The predicted position of this rigid-body.
|
/// The predicted position of this rigid-body.
|
||||||
@@ -251,6 +316,16 @@ impl RigidBody {
|
|||||||
self.rb_forces.gravity_scale = scale;
|
self.rb_forces.gravity_scale = scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The dominance group of this rigid-body.
|
||||||
|
pub fn dominance_group(&self) -> i8 {
|
||||||
|
self.rb_dominance.0
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The dominance group of this rigid-body.
|
||||||
|
pub fn set_dominance_group(&mut self, dominance: i8) {
|
||||||
|
self.rb_dominance.0 = dominance
|
||||||
|
}
|
||||||
|
|
||||||
/// Adds a collider to this rigid-body.
|
/// Adds a collider to this rigid-body.
|
||||||
// TODO ECS: we keep this public for now just to simply our experiments on bevy_rapier.
|
// TODO ECS: we keep this public for now just to simply our experiments on bevy_rapier.
|
||||||
pub fn add_collider(
|
pub fn add_collider(
|
||||||
@@ -259,7 +334,7 @@ impl RigidBody {
|
|||||||
co_parent: &ColliderParent,
|
co_parent: &ColliderParent,
|
||||||
co_pos: &mut ColliderPosition,
|
co_pos: &mut ColliderPosition,
|
||||||
co_shape: &ColliderShape,
|
co_shape: &ColliderShape,
|
||||||
co_mprops: &ColliderMassProperties,
|
co_mprops: &ColliderMassProps,
|
||||||
) {
|
) {
|
||||||
self.rb_colliders.attach_collider(
|
self.rb_colliders.attach_collider(
|
||||||
&mut self.changes,
|
&mut self.changes,
|
||||||
@@ -279,10 +354,11 @@ impl RigidBody {
|
|||||||
if let Some(i) = self.rb_colliders.0.iter().position(|e| *e == handle) {
|
if let Some(i) = self.rb_colliders.0.iter().position(|e| *e == handle) {
|
||||||
self.changes.set(RigidBodyChanges::COLLIDERS, true);
|
self.changes.set(RigidBodyChanges::COLLIDERS, true);
|
||||||
self.rb_colliders.0.swap_remove(i);
|
self.rb_colliders.0.swap_remove(i);
|
||||||
|
|
||||||
let mass_properties = coll
|
let mass_properties = coll
|
||||||
.mass_properties()
|
.mass_properties()
|
||||||
.transform_by(coll.position_wrt_parent());
|
.transform_by(coll.position_wrt_parent().unwrap());
|
||||||
self.rb_mprops.mass_properties -= mass_properties;
|
self.rb_mprops.local_mprops -= mass_properties;
|
||||||
self.update_world_mass_properties();
|
self.update_world_mass_properties();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -384,6 +460,45 @@ impl RigidBody {
|
|||||||
&self.rb_pos.position
|
&self.rb_pos.position
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The translational part of this rigid-body's position.
|
||||||
|
#[inline]
|
||||||
|
pub fn translation(&self) -> &Vector<Real> {
|
||||||
|
&self.rb_pos.position.translation.vector
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the translational part of this rigid-body's position.
|
||||||
|
#[inline]
|
||||||
|
pub fn set_translation(&mut self, translation: Vector<Real>, wake_up: bool) {
|
||||||
|
self.changes.insert(RigidBodyChanges::POSITION);
|
||||||
|
self.rb_pos.position.translation.vector = translation;
|
||||||
|
self.rb_pos.next_position.translation.vector = translation;
|
||||||
|
|
||||||
|
// TODO: Do we really need to check that the body isn't dynamic?
|
||||||
|
if wake_up && self.is_dynamic() {
|
||||||
|
self.wake_up(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The translational part of this rigid-body's position.
|
||||||
|
#[inline]
|
||||||
|
pub fn rotation(&self) -> &Rotation<Real> {
|
||||||
|
&self.rb_pos.position.rotation
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Sets the rotational part of this rigid-body's position.
|
||||||
|
#[inline]
|
||||||
|
pub fn set_rotation(&mut self, rotation: AngVector<Real>, wake_up: bool) {
|
||||||
|
self.changes.insert(RigidBodyChanges::POSITION);
|
||||||
|
let rotation = Rotation::new(rotation);
|
||||||
|
self.rb_pos.position.rotation = rotation;
|
||||||
|
self.rb_pos.next_position.rotation = rotation;
|
||||||
|
|
||||||
|
// TODO: Do we really need to check that the body isn't dynamic?
|
||||||
|
if wake_up && self.is_dynamic() {
|
||||||
|
self.wake_up(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the position and `next_kinematic_position` of this rigid body.
|
/// Sets the position and `next_kinematic_position` of this rigid body.
|
||||||
///
|
///
|
||||||
/// This will teleport the rigid-body to the specified position/orientation,
|
/// This will teleport the rigid-body to the specified position/orientation,
|
||||||
@@ -404,6 +519,20 @@ impl RigidBody {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// If this rigid body is kinematic, sets its future translation after the next timestep integration.
|
||||||
|
pub fn set_next_kinematic_rotation(&mut self, rotation: AngVector<Real>) {
|
||||||
|
if self.is_kinematic() {
|
||||||
|
self.rb_pos.next_position.rotation = Rotation::new(rotation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If this rigid body is kinematic, sets its future orientation after the next timestep integration.
|
||||||
|
pub fn set_next_kinematic_translation(&mut self, translation: Vector<Real>) {
|
||||||
|
if self.is_kinematic() {
|
||||||
|
self.rb_pos.next_position.translation = translation.into();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// If this rigid body is kinematic, sets its future position after the next timestep integration.
|
/// If this rigid body is kinematic, sets its future position after the next timestep integration.
|
||||||
pub fn set_next_kinematic_position(&mut self, pos: Isometry<Real>) {
|
pub fn set_next_kinematic_position(&mut self, pos: Isometry<Real>) {
|
||||||
if self.is_kinematic() {
|
if self.is_kinematic() {
|
||||||
@@ -411,6 +540,17 @@ impl RigidBody {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Predicts the next position of this rigid-body, by integrating its velocity and forces
|
||||||
|
/// by a time of `dt`.
|
||||||
|
pub fn predict_position_using_velocity_and_forces(&self, dt: Real) -> Isometry<Real> {
|
||||||
|
self.rb_pos.integrate_forces_and_velocities(
|
||||||
|
dt,
|
||||||
|
&self.rb_forces,
|
||||||
|
&self.rb_vels,
|
||||||
|
&self.rb_mprops,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn update_world_mass_properties(&mut self) {
|
pub(crate) fn update_world_mass_properties(&mut self) {
|
||||||
self.rb_mprops
|
self.rb_mprops
|
||||||
.update_world_mass_properties(&self.rb_pos.position);
|
.update_world_mass_properties(&self.rb_pos.position);
|
||||||
@@ -551,7 +691,7 @@ impl RigidBody {
|
|||||||
pub fn gravitational_potential_energy(&self, dt: Real, gravity: Vector<Real>) -> Real {
|
pub fn gravitational_potential_energy(&self, dt: Real, gravity: Vector<Real>) -> Real {
|
||||||
let world_com = self
|
let world_com = self
|
||||||
.rb_mprops
|
.rb_mprops
|
||||||
.mass_properties
|
.local_mprops
|
||||||
.world_com(&self.rb_pos.position)
|
.world_com(&self.rb_pos.position)
|
||||||
.coords;
|
.coords;
|
||||||
|
|
||||||
@@ -608,8 +748,13 @@ impl RigidBodyBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Initializes the builder of a new kinematic rigid body.
|
/// Initializes the builder of a new kinematic rigid body.
|
||||||
pub fn new_kinematic() -> Self {
|
pub fn new_kinematic_velocity_based() -> Self {
|
||||||
Self::new(RigidBodyType::Kinematic)
|
Self::new(RigidBodyType::KinematicVelocityBased)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Initializes the builder of a new kinematic rigid body.
|
||||||
|
pub fn new_kinematic_position_based() -> Self {
|
||||||
|
Self::new(RigidBodyType::KinematicPositionBased)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Initializes the builder of a new dynamic rigid body.
|
/// Initializes the builder of a new dynamic rigid body.
|
||||||
@@ -618,8 +763,8 @@ impl RigidBodyBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the scale applied to the gravity force affecting the rigid-body to be created.
|
/// Sets the scale applied to the gravity force affecting the rigid-body to be created.
|
||||||
pub fn gravity_scale(mut self, x: Real) -> Self {
|
pub fn gravity_scale(mut self, scale_factor: Real) -> Self {
|
||||||
self.gravity_scale = x;
|
self.gravity_scale = scale_factor;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -630,19 +775,8 @@ impl RigidBodyBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the initial translation of the rigid-body to be created.
|
/// Sets the initial translation of the rigid-body to be created.
|
||||||
#[cfg(feature = "dim2")]
|
pub fn translation(mut self, translation: Vector<Real>) -> Self {
|
||||||
pub fn translation(mut self, x: Real, y: Real) -> Self {
|
self.position.translation.vector = translation;
|
||||||
self.position.translation.x = x;
|
|
||||||
self.position.translation.y = y;
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Sets the initial translation of the rigid-body to be created.
|
|
||||||
#[cfg(feature = "dim3")]
|
|
||||||
pub fn translation(mut self, x: Real, y: Real, z: Real) -> Self {
|
|
||||||
self.position.translation.x = x;
|
|
||||||
self.position.translation.y = y;
|
|
||||||
self.position.translation.z = z;
|
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -811,16 +945,8 @@ impl RigidBodyBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the initial linear velocity of the rigid-body to be created.
|
/// Sets the initial linear velocity of the rigid-body to be created.
|
||||||
#[cfg(feature = "dim2")]
|
pub fn linvel(mut self, linvel: Vector<Real>) -> Self {
|
||||||
pub fn linvel(mut self, x: Real, y: Real) -> Self {
|
self.linvel = linvel;
|
||||||
self.linvel = Vector::new(x, y);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Sets the initial linear velocity of the rigid-body to be created.
|
|
||||||
#[cfg(feature = "dim3")]
|
|
||||||
pub fn linvel(mut self, x: Real, y: Real, z: Real) -> Self {
|
|
||||||
self.linvel = Vector::new(x, y, z);
|
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -857,7 +983,7 @@ impl RigidBodyBuilder {
|
|||||||
rb.rb_vels.angvel = self.angvel;
|
rb.rb_vels.angvel = self.angvel;
|
||||||
rb.rb_type = self.rb_type;
|
rb.rb_type = self.rb_type;
|
||||||
rb.user_data = self.user_data;
|
rb.user_data = self.user_data;
|
||||||
rb.rb_mprops.mass_properties = self.mass_properties;
|
rb.rb_mprops.local_mprops = self.mass_properties;
|
||||||
rb.rb_mprops.flags = self.mprops_flags;
|
rb.rb_mprops.flags = self.mprops_flags;
|
||||||
rb.rb_damping.linear_damping = self.linear_damping;
|
rb.rb_damping.linear_damping = self.linear_damping;
|
||||||
rb.rb_damping.angular_damping = self.angular_damping;
|
rb.rb_damping.angular_damping = self.angular_damping;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use crate::data::{ComponentSetMut, ComponentSetOption};
|
use crate::data::{ComponentSetMut, ComponentSetOption};
|
||||||
use crate::dynamics::MassProperties;
|
use crate::dynamics::MassProperties;
|
||||||
use crate::geometry::{
|
use crate::geometry::{
|
||||||
ColliderChanges, ColliderHandle, ColliderMassProperties, ColliderParent, ColliderPosition,
|
ColliderChanges, ColliderHandle, ColliderMassProps, ColliderParent, ColliderPosition,
|
||||||
ColliderShape, InteractionGraph, RigidBodyGraphIndex,
|
ColliderShape, InteractionGraph, RigidBodyGraphIndex,
|
||||||
};
|
};
|
||||||
use crate::math::{AngVector, AngularInertia, Isometry, Point, Real, Translation, Vector};
|
use crate::math::{AngVector, AngularInertia, Isometry, Point, Real, Translation, Vector};
|
||||||
@@ -54,16 +54,23 @@ pub type BodyStatus = RigidBodyType;
|
|||||||
/// The status of a body, governing the way it is affected by external forces.
|
/// The status of a body, governing the way it is affected by external forces.
|
||||||
pub enum RigidBodyType {
|
pub enum RigidBodyType {
|
||||||
/// A `RigidBodyType::Dynamic` body can be affected by all external forces.
|
/// A `RigidBodyType::Dynamic` body can be affected by all external forces.
|
||||||
Dynamic,
|
Dynamic = 0,
|
||||||
/// A `RigidBodyType::Static` body cannot be affected by external forces.
|
/// A `RigidBodyType::Static` body cannot be affected by external forces.
|
||||||
Static,
|
Static = 1,
|
||||||
/// A `RigidBodyType::Kinematic` body cannot be affected by any external forces but can be controlled
|
/// A `RigidBodyType::KinematicPositionBased` body cannot be affected by any external forces but can be controlled
|
||||||
/// by the user at the position level while keeping realistic one-way interaction with dynamic bodies.
|
/// by the user at the position level while keeping realistic one-way interaction with dynamic bodies.
|
||||||
///
|
///
|
||||||
/// One-way interaction means that a kinematic body can push a dynamic body, but a kinematic body
|
/// One-way interaction means that a kinematic body can push a dynamic body, but a kinematic body
|
||||||
/// cannot be pushed by anything. In other words, the trajectory of a kinematic body can only be
|
/// cannot be pushed by anything. In other words, the trajectory of a kinematic body can only be
|
||||||
/// modified by the user and is independent from any contact or joint it is involved in.
|
/// modified by the user and is independent from any contact or joint it is involved in.
|
||||||
Kinematic,
|
KinematicPositionBased = 2,
|
||||||
|
/// A `RigidBodyType::KinematicVelocityBased` body cannot be affected by any external forces but can be controlled
|
||||||
|
/// by the user at the velocity level while keeping realistic one-way interaction with dynamic bodies.
|
||||||
|
///
|
||||||
|
/// One-way interaction means that a kinematic body can push a dynamic body, but a kinematic body
|
||||||
|
/// cannot be pushed by anything. In other words, the trajectory of a kinematic body can only be
|
||||||
|
/// modified by the user and is independent from any contact or joint it is involved in.
|
||||||
|
KinematicVelocityBased = 3,
|
||||||
// Semikinematic, // A kinematic that performs automatic CCD with the static environment to avoid traversing it?
|
// Semikinematic, // A kinematic that performs automatic CCD with the static environment to avoid traversing it?
|
||||||
// Disabled,
|
// Disabled,
|
||||||
}
|
}
|
||||||
@@ -81,7 +88,8 @@ impl RigidBodyType {
|
|||||||
|
|
||||||
/// Is this rigid-body kinematic (i.e. can move but is unaffected by forces)?
|
/// Is this rigid-body kinematic (i.e. can move but is unaffected by forces)?
|
||||||
pub fn is_kinematic(self) -> bool {
|
pub fn is_kinematic(self) -> bool {
|
||||||
self == RigidBodyType::Kinematic
|
self == RigidBodyType::KinematicPositionBased
|
||||||
|
|| self == RigidBodyType::KinematicVelocityBased
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,7 +174,7 @@ impl RigidBodyPosition {
|
|||||||
mprops: &RigidBodyMassProps,
|
mprops: &RigidBodyMassProps,
|
||||||
) -> Isometry<Real> {
|
) -> Isometry<Real> {
|
||||||
let new_vels = forces.integrate(dt, vels, mprops);
|
let new_vels = forces.integrate(dt, vels, mprops);
|
||||||
new_vels.integrate(dt, &self.position, &mprops.mass_properties.local_com)
|
new_vels.integrate(dt, &self.position, &mprops.local_mprops.local_com)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,7 +216,7 @@ pub struct RigidBodyMassProps {
|
|||||||
/// Flags for locking rotation and translation.
|
/// Flags for locking rotation and translation.
|
||||||
pub flags: RigidBodyMassPropsFlags,
|
pub flags: RigidBodyMassPropsFlags,
|
||||||
/// The local mass properties of the rigid-body.
|
/// The local mass properties of the rigid-body.
|
||||||
pub mass_properties: MassProperties,
|
pub local_mprops: MassProperties,
|
||||||
/// The world-space center of mass of the rigid-body.
|
/// The world-space center of mass of the rigid-body.
|
||||||
pub world_com: Point<Real>,
|
pub world_com: Point<Real>,
|
||||||
/// The inverse mass taking into account translation locking.
|
/// The inverse mass taking into account translation locking.
|
||||||
@@ -222,7 +230,7 @@ impl Default for RigidBodyMassProps {
|
|||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
flags: RigidBodyMassPropsFlags::empty(),
|
flags: RigidBodyMassPropsFlags::empty(),
|
||||||
mass_properties: MassProperties::zero(),
|
local_mprops: MassProperties::zero(),
|
||||||
world_com: Point::origin(),
|
world_com: Point::origin(),
|
||||||
effective_inv_mass: 0.0,
|
effective_inv_mass: 0.0,
|
||||||
effective_world_inv_inertia_sqrt: AngularInertia::zero(),
|
effective_world_inv_inertia_sqrt: AngularInertia::zero(),
|
||||||
@@ -239,11 +247,20 @@ impl From<RigidBodyMassPropsFlags> for RigidBodyMassProps {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<MassProperties> for RigidBodyMassProps {
|
||||||
|
fn from(local_mprops: MassProperties) -> Self {
|
||||||
|
Self {
|
||||||
|
local_mprops,
|
||||||
|
..Default::default()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl RigidBodyMassProps {
|
impl RigidBodyMassProps {
|
||||||
/// The mass of the rigid-body.
|
/// The mass of the rigid-body.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn mass(&self) -> Real {
|
pub fn mass(&self) -> Real {
|
||||||
crate::utils::inv(self.mass_properties.inv_mass)
|
crate::utils::inv(self.local_mprops.inv_mass)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The effective mass (that takes the potential translation locking into account) of
|
/// The effective mass (that takes the potential translation locking into account) of
|
||||||
@@ -255,11 +272,10 @@ impl RigidBodyMassProps {
|
|||||||
|
|
||||||
/// Update the world-space mass properties of `self`, taking into account the new position.
|
/// Update the world-space mass properties of `self`, taking into account the new position.
|
||||||
pub fn update_world_mass_properties(&mut self, position: &Isometry<Real>) {
|
pub fn update_world_mass_properties(&mut self, position: &Isometry<Real>) {
|
||||||
self.world_com = self.mass_properties.world_com(&position);
|
self.world_com = self.local_mprops.world_com(&position);
|
||||||
self.effective_inv_mass = self.mass_properties.inv_mass;
|
self.effective_inv_mass = self.local_mprops.inv_mass;
|
||||||
self.effective_world_inv_inertia_sqrt = self
|
self.effective_world_inv_inertia_sqrt =
|
||||||
.mass_properties
|
self.local_mprops.world_inv_inertia_sqrt(&position.rotation);
|
||||||
.world_inv_inertia_sqrt(&position.rotation);
|
|
||||||
|
|
||||||
// Take into account translation/rotation locking.
|
// Take into account translation/rotation locking.
|
||||||
if self
|
if self
|
||||||
@@ -665,7 +681,7 @@ impl RigidBodyColliders {
|
|||||||
co_pos: &mut ColliderPosition,
|
co_pos: &mut ColliderPosition,
|
||||||
co_parent: &ColliderParent,
|
co_parent: &ColliderParent,
|
||||||
co_shape: &ColliderShape,
|
co_shape: &ColliderShape,
|
||||||
co_mprops: &ColliderMassProperties,
|
co_mprops: &ColliderMassProps,
|
||||||
) {
|
) {
|
||||||
rb_changes.set(
|
rb_changes.set(
|
||||||
RigidBodyChanges::MODIFIED | RigidBodyChanges::COLLIDERS,
|
RigidBodyChanges::MODIFIED | RigidBodyChanges::COLLIDERS,
|
||||||
@@ -684,7 +700,7 @@ impl RigidBodyColliders {
|
|||||||
.mass_properties(&**co_shape)
|
.mass_properties(&**co_shape)
|
||||||
.transform_by(&co_parent.pos_wrt_parent);
|
.transform_by(&co_parent.pos_wrt_parent);
|
||||||
self.0.push(co_handle);
|
self.0.push(co_handle);
|
||||||
rb_mprops.mass_properties += mass_properties;
|
rb_mprops.local_mprops += mass_properties;
|
||||||
rb_mprops.update_world_mass_properties(&rb_pos.position);
|
rb_mprops.update_world_mass_properties(&rb_pos.position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -759,7 +775,7 @@ pub struct RigidBodyActivation {
|
|||||||
|
|
||||||
impl Default for RigidBodyActivation {
|
impl Default for RigidBodyActivation {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self::new_active()
|
Self::active()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -770,7 +786,7 @@ impl RigidBodyActivation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new rb_activation status initialised with the default rb_activation threshold and is active.
|
/// Create a new rb_activation status initialised with the default rb_activation threshold and is active.
|
||||||
pub fn new_active() -> Self {
|
pub fn active() -> Self {
|
||||||
RigidBodyActivation {
|
RigidBodyActivation {
|
||||||
threshold: Self::default_threshold(),
|
threshold: Self::default_threshold(),
|
||||||
energy: Self::default_threshold() * 4.0,
|
energy: Self::default_threshold() * 4.0,
|
||||||
@@ -779,7 +795,7 @@ impl RigidBodyActivation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new rb_activation status initialised with the default rb_activation threshold and is inactive.
|
/// Create a new rb_activation status initialised with the default rb_activation threshold and is inactive.
|
||||||
pub fn new_inactive() -> Self {
|
pub fn inactive() -> Self {
|
||||||
RigidBodyActivation {
|
RigidBodyActivation {
|
||||||
threshold: Self::default_threshold(),
|
threshold: Self::default_threshold(),
|
||||||
energy: 0.0,
|
energy: 0.0,
|
||||||
@@ -787,6 +803,14 @@ impl RigidBodyActivation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a new activation status that prevents the rigid-body from sleeping.
|
||||||
|
pub fn cannot_sleep() -> Self {
|
||||||
|
RigidBodyActivation {
|
||||||
|
threshold: -Real::MAX,
|
||||||
|
..Self::active()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns `true` if the body is not asleep.
|
/// Returns `true` if the body is not asleep.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_active(&self) -> bool {
|
pub fn is_active(&self) -> bool {
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ impl IslandSolver {
|
|||||||
let mut new_poss = *poss;
|
let mut new_poss = *poss;
|
||||||
let new_vels = vels.apply_damping(params.dt, damping);
|
let new_vels = vels.apply_damping(params.dt, damping);
|
||||||
new_poss.next_position =
|
new_poss.next_position =
|
||||||
vels.integrate(params.dt, &poss.position, &mprops.mass_properties.local_com);
|
vels.integrate(params.dt, &poss.position, &mprops.local_mprops.local_com);
|
||||||
|
|
||||||
bodies.set_internal(handle.0, new_vels);
|
bodies.set_internal(handle.0, new_vels);
|
||||||
bodies.set_internal(handle.0, new_poss);
|
bodies.set_internal(handle.0, new_poss);
|
||||||
@@ -140,7 +140,7 @@ impl IslandSolver {
|
|||||||
.integrate(params.dt, vels, mprops)
|
.integrate(params.dt, vels, mprops)
|
||||||
.apply_damping(params.dt, &damping);
|
.apply_damping(params.dt, &damping);
|
||||||
new_poss.next_position =
|
new_poss.next_position =
|
||||||
vels.integrate(params.dt, &poss.position, &mprops.mass_properties.local_com);
|
vels.integrate(params.dt, &poss.position, &mprops.local_mprops.local_com);
|
||||||
|
|
||||||
bodies.set_internal(handle.0, new_vels);
|
bodies.set_internal(handle.0, new_vels);
|
||||||
bodies.set_internal(handle.0, new_poss);
|
bodies.set_internal(handle.0, new_poss);
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ impl BallPositionConstraint {
|
|||||||
let (mprops2, ids2) = rb2;
|
let (mprops2, ids2) = rb2;
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
local_com1: mprops1.mass_properties.local_com,
|
local_com1: mprops1.local_mprops.local_com,
|
||||||
local_com2: mprops2.mass_properties.local_com,
|
local_com2: mprops2.local_mprops.local_com,
|
||||||
im1: mprops1.effective_inv_mass,
|
im1: mprops1.effective_inv_mass,
|
||||||
im2: mprops2.effective_inv_mass,
|
im2: mprops2.effective_inv_mass,
|
||||||
ii1: mprops1.effective_world_inv_inertia_sqrt.squared(),
|
ii1: mprops1.effective_world_inv_inertia_sqrt.squared(),
|
||||||
@@ -131,7 +131,7 @@ impl BallPositionGroundConstraint {
|
|||||||
ii2: mprops2.effective_world_inv_inertia_sqrt.squared(),
|
ii2: mprops2.effective_world_inv_inertia_sqrt.squared(),
|
||||||
local_anchor2: cparams.local_anchor1,
|
local_anchor2: cparams.local_anchor1,
|
||||||
position2: ids2.active_set_offset,
|
position2: ids2.active_set_offset,
|
||||||
local_com2: mprops2.mass_properties.local_com,
|
local_com2: mprops2.local_mprops.local_com,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Self {
|
Self {
|
||||||
@@ -140,7 +140,7 @@ impl BallPositionGroundConstraint {
|
|||||||
ii2: mprops2.effective_world_inv_inertia_sqrt.squared(),
|
ii2: mprops2.effective_world_inv_inertia_sqrt.squared(),
|
||||||
local_anchor2: cparams.local_anchor2,
|
local_anchor2: cparams.local_anchor2,
|
||||||
position2: ids2.active_set_offset,
|
position2: ids2.active_set_offset,
|
||||||
local_com2: mprops2.mass_properties.local_com,
|
local_com2: mprops2.local_mprops.local_com,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ impl WBallPositionConstraint {
|
|||||||
let (mprops1, ids1) = rbs1;
|
let (mprops1, ids1) = rbs1;
|
||||||
let (mprops2, ids2) = rbs2;
|
let (mprops2, ids2) = rbs2;
|
||||||
|
|
||||||
let local_com1 = Point::from(gather![|ii| mprops1[ii].mass_properties.local_com]);
|
let local_com1 = Point::from(gather![|ii| mprops1[ii].local_mprops.local_com]);
|
||||||
let local_com2 = Point::from(gather![|ii| mprops2[ii].mass_properties.local_com]);
|
let local_com2 = Point::from(gather![|ii| mprops2[ii].local_mprops.local_com]);
|
||||||
let im1 = SimdReal::from(gather![|ii| mprops1[ii].effective_inv_mass]);
|
let im1 = SimdReal::from(gather![|ii| mprops1[ii].effective_inv_mass]);
|
||||||
let im2 = SimdReal::from(gather![|ii| mprops2[ii].effective_inv_mass]);
|
let im2 = SimdReal::from(gather![|ii| mprops2[ii].effective_inv_mass]);
|
||||||
let ii1 = AngularInertia::<SimdReal>::from(gather![
|
let ii1 = AngularInertia::<SimdReal>::from(gather![
|
||||||
@@ -169,7 +169,7 @@ impl WBallPositionGroundConstraint {
|
|||||||
cparams[ii].local_anchor2
|
cparams[ii].local_anchor2
|
||||||
}]);
|
}]);
|
||||||
let position2 = gather![|ii| ids2[ii].active_set_offset];
|
let position2 = gather![|ii| ids2[ii].active_set_offset];
|
||||||
let local_com2 = Point::from(gather![|ii| mprops2[ii].mass_properties.local_com]);
|
let local_com2 = Point::from(gather![|ii| mprops2[ii].local_mprops.local_com]);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
anchor1,
|
anchor1,
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ use crate::utils::WAngularInertia;
|
|||||||
pub(crate) struct FixedPositionConstraint {
|
pub(crate) struct FixedPositionConstraint {
|
||||||
position1: usize,
|
position1: usize,
|
||||||
position2: usize,
|
position2: usize,
|
||||||
local_anchor1: Isometry<Real>,
|
local_frame1: Isometry<Real>,
|
||||||
local_anchor2: Isometry<Real>,
|
local_frame2: Isometry<Real>,
|
||||||
local_com1: Point<Real>,
|
local_com1: Point<Real>,
|
||||||
local_com2: Point<Real>,
|
local_com2: Point<Real>,
|
||||||
im1: Real,
|
im1: Real,
|
||||||
@@ -38,16 +38,16 @@ impl FixedPositionConstraint {
|
|||||||
let ang_inv_lhs = (ii1 + ii2).inverse();
|
let ang_inv_lhs = (ii1 + ii2).inverse();
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
local_anchor1: cparams.local_anchor1,
|
local_frame1: cparams.local_frame1,
|
||||||
local_anchor2: cparams.local_anchor2,
|
local_frame2: cparams.local_frame2,
|
||||||
position1: ids1.active_set_offset,
|
position1: ids1.active_set_offset,
|
||||||
position2: ids2.active_set_offset,
|
position2: ids2.active_set_offset,
|
||||||
im1,
|
im1,
|
||||||
im2,
|
im2,
|
||||||
ii1,
|
ii1,
|
||||||
ii2,
|
ii2,
|
||||||
local_com1: mprops1.mass_properties.local_com,
|
local_com1: mprops1.local_mprops.local_com,
|
||||||
local_com2: mprops2.mass_properties.local_com,
|
local_com2: mprops2.local_mprops.local_com,
|
||||||
lin_inv_lhs,
|
lin_inv_lhs,
|
||||||
ang_inv_lhs,
|
ang_inv_lhs,
|
||||||
}
|
}
|
||||||
@@ -58,8 +58,8 @@ impl FixedPositionConstraint {
|
|||||||
let mut position2 = positions[self.position2 as usize];
|
let mut position2 = positions[self.position2 as usize];
|
||||||
|
|
||||||
// Angular correction.
|
// Angular correction.
|
||||||
let anchor1 = position1 * self.local_anchor1;
|
let anchor1 = position1 * self.local_frame1;
|
||||||
let anchor2 = position2 * self.local_anchor2;
|
let anchor2 = position2 * self.local_frame2;
|
||||||
let ang_err = anchor2.rotation * anchor1.rotation.inverse();
|
let ang_err = anchor2.rotation * anchor1.rotation.inverse();
|
||||||
#[cfg(feature = "dim3")]
|
#[cfg(feature = "dim3")]
|
||||||
let ang_impulse = self
|
let ang_impulse = self
|
||||||
@@ -75,8 +75,8 @@ impl FixedPositionConstraint {
|
|||||||
Rotation::new(self.ii2.transform_vector(-ang_impulse)) * position2.rotation;
|
Rotation::new(self.ii2.transform_vector(-ang_impulse)) * position2.rotation;
|
||||||
|
|
||||||
// Linear correction.
|
// Linear correction.
|
||||||
let anchor1 = position1 * Point::from(self.local_anchor1.translation.vector);
|
let anchor1 = position1 * Point::from(self.local_frame1.translation.vector);
|
||||||
let anchor2 = position2 * Point::from(self.local_anchor2.translation.vector);
|
let anchor2 = position2 * Point::from(self.local_frame2.translation.vector);
|
||||||
let err = anchor2 - anchor1;
|
let err = anchor2 - anchor1;
|
||||||
let impulse = err * (self.lin_inv_lhs * params.joint_erp);
|
let impulse = err * (self.lin_inv_lhs * params.joint_erp);
|
||||||
position1.translation.vector += self.im1 * impulse;
|
position1.translation.vector += self.im1 * impulse;
|
||||||
@@ -91,7 +91,7 @@ impl FixedPositionConstraint {
|
|||||||
pub(crate) struct FixedPositionGroundConstraint {
|
pub(crate) struct FixedPositionGroundConstraint {
|
||||||
position2: usize,
|
position2: usize,
|
||||||
anchor1: Isometry<Real>,
|
anchor1: Isometry<Real>,
|
||||||
local_anchor2: Isometry<Real>,
|
local_frame2: Isometry<Real>,
|
||||||
local_com2: Point<Real>,
|
local_com2: Point<Real>,
|
||||||
im2: Real,
|
im2: Real,
|
||||||
ii2: AngularInertia<Real>,
|
ii2: AngularInertia<Real>,
|
||||||
@@ -109,23 +109,23 @@ impl FixedPositionGroundConstraint {
|
|||||||
let (mprops2, ids2) = rb2;
|
let (mprops2, ids2) = rb2;
|
||||||
|
|
||||||
let anchor1;
|
let anchor1;
|
||||||
let local_anchor2;
|
let local_frame2;
|
||||||
|
|
||||||
if flipped {
|
if flipped {
|
||||||
anchor1 = poss1.next_position * cparams.local_anchor2;
|
anchor1 = poss1.next_position * cparams.local_frame2;
|
||||||
local_anchor2 = cparams.local_anchor1;
|
local_frame2 = cparams.local_frame1;
|
||||||
} else {
|
} else {
|
||||||
anchor1 = poss1.next_position * cparams.local_anchor1;
|
anchor1 = poss1.next_position * cparams.local_frame1;
|
||||||
local_anchor2 = cparams.local_anchor2;
|
local_frame2 = cparams.local_frame2;
|
||||||
};
|
};
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
anchor1,
|
anchor1,
|
||||||
local_anchor2,
|
local_frame2,
|
||||||
position2: ids2.active_set_offset,
|
position2: ids2.active_set_offset,
|
||||||
im2: mprops2.effective_inv_mass,
|
im2: mprops2.effective_inv_mass,
|
||||||
ii2: mprops2.effective_world_inv_inertia_sqrt.squared(),
|
ii2: mprops2.effective_world_inv_inertia_sqrt.squared(),
|
||||||
local_com2: mprops2.mass_properties.local_com,
|
local_com2: mprops2.local_mprops.local_com,
|
||||||
impulse: 0.0,
|
impulse: 0.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,13 +134,13 @@ impl FixedPositionGroundConstraint {
|
|||||||
let mut position2 = positions[self.position2 as usize];
|
let mut position2 = positions[self.position2 as usize];
|
||||||
|
|
||||||
// Angular correction.
|
// Angular correction.
|
||||||
let anchor2 = position2 * self.local_anchor2;
|
let anchor2 = position2 * self.local_frame2;
|
||||||
let ang_err = anchor2.rotation * self.anchor1.rotation.inverse();
|
let ang_err = anchor2.rotation * self.anchor1.rotation.inverse();
|
||||||
position2.rotation = ang_err.powf(-params.joint_erp) * position2.rotation;
|
position2.rotation = ang_err.powf(-params.joint_erp) * position2.rotation;
|
||||||
|
|
||||||
// Linear correction.
|
// Linear correction.
|
||||||
let anchor1 = Point::from(self.anchor1.translation.vector);
|
let anchor1 = Point::from(self.anchor1.translation.vector);
|
||||||
let anchor2 = position2 * Point::from(self.local_anchor2.translation.vector);
|
let anchor2 = position2 * Point::from(self.local_frame2.translation.vector);
|
||||||
let err = anchor2 - anchor1;
|
let err = anchor2 - anchor1;
|
||||||
// NOTE: no need to divide by im2 just to multiply right after.
|
// NOTE: no need to divide by im2 just to multiply right after.
|
||||||
let impulse = err * params.joint_erp;
|
let impulse = err * params.joint_erp;
|
||||||
|
|||||||
@@ -63,8 +63,8 @@ impl FixedVelocityConstraint {
|
|||||||
let (poss1, vels1, mprops1, ids1) = rb1;
|
let (poss1, vels1, mprops1, ids1) = rb1;
|
||||||
let (poss2, vels2, mprops2, ids2) = rb2;
|
let (poss2, vels2, mprops2, ids2) = rb2;
|
||||||
|
|
||||||
let anchor1 = poss1.position * cparams.local_anchor1;
|
let anchor1 = poss1.position * cparams.local_frame1;
|
||||||
let anchor2 = poss2.position * cparams.local_anchor2;
|
let anchor2 = poss2.position * cparams.local_frame2;
|
||||||
let im1 = mprops1.effective_inv_mass;
|
let im1 = mprops1.effective_inv_mass;
|
||||||
let im2 = mprops2.effective_inv_mass;
|
let im2 = mprops2.effective_inv_mass;
|
||||||
let ii1 = mprops1.effective_world_inv_inertia_sqrt.squared();
|
let ii1 = mprops1.effective_world_inv_inertia_sqrt.squared();
|
||||||
@@ -280,13 +280,13 @@ impl FixedVelocityGroundConstraint {
|
|||||||
|
|
||||||
let (anchor1, anchor2) = if flipped {
|
let (anchor1, anchor2) = if flipped {
|
||||||
(
|
(
|
||||||
poss1.position * cparams.local_anchor2,
|
poss1.position * cparams.local_frame2,
|
||||||
poss2.position * cparams.local_anchor1,
|
poss2.position * cparams.local_frame1,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
(
|
(
|
||||||
poss1.position * cparams.local_anchor1,
|
poss1.position * cparams.local_frame1,
|
||||||
poss2.position * cparams.local_anchor2,
|
poss2.position * cparams.local_frame2,
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -91,12 +91,12 @@ impl WFixedVelocityConstraint {
|
|||||||
]);
|
]);
|
||||||
let mj_lambda2 = gather![|ii| ids2[ii].active_set_offset];
|
let mj_lambda2 = gather![|ii| ids2[ii].active_set_offset];
|
||||||
|
|
||||||
let local_anchor1 = Isometry::from(gather![|ii| cparams[ii].local_anchor1]);
|
let local_frame1 = Isometry::from(gather![|ii| cparams[ii].local_frame1]);
|
||||||
let local_anchor2 = Isometry::from(gather![|ii| cparams[ii].local_anchor2]);
|
let local_frame2 = Isometry::from(gather![|ii| cparams[ii].local_frame2]);
|
||||||
let impulse = SpacialVector::from(gather![|ii| cparams[ii].impulse]);
|
let impulse = SpacialVector::from(gather![|ii| cparams[ii].impulse]);
|
||||||
|
|
||||||
let anchor1 = position1 * local_anchor1;
|
let anchor1 = position1 * local_frame1;
|
||||||
let anchor2 = position2 * local_anchor2;
|
let anchor2 = position2 * local_frame2;
|
||||||
let ii1 = ii1_sqrt.squared();
|
let ii1 = ii1_sqrt.squared();
|
||||||
let ii2 = ii2_sqrt.squared();
|
let ii2 = ii2_sqrt.squared();
|
||||||
let r1 = anchor1.translation.vector - world_com1.coords;
|
let r1 = anchor1.translation.vector - world_com1.coords;
|
||||||
@@ -363,20 +363,20 @@ impl WFixedVelocityGroundConstraint {
|
|||||||
]);
|
]);
|
||||||
let mj_lambda2 = gather![|ii| ids2[ii].active_set_offset];
|
let mj_lambda2 = gather![|ii| ids2[ii].active_set_offset];
|
||||||
|
|
||||||
let local_anchor1 = Isometry::from(gather![|ii| if flipped[ii] {
|
let local_frame1 = Isometry::from(gather![|ii| if flipped[ii] {
|
||||||
cparams[ii].local_anchor2
|
cparams[ii].local_frame2
|
||||||
} else {
|
} else {
|
||||||
cparams[ii].local_anchor1
|
cparams[ii].local_frame1
|
||||||
}]);
|
}]);
|
||||||
let local_anchor2 = Isometry::from(gather![|ii| if flipped[ii] {
|
let local_frame2 = Isometry::from(gather![|ii| if flipped[ii] {
|
||||||
cparams[ii].local_anchor1
|
cparams[ii].local_frame1
|
||||||
} else {
|
} else {
|
||||||
cparams[ii].local_anchor2
|
cparams[ii].local_frame2
|
||||||
}]);
|
}]);
|
||||||
let impulse = SpacialVector::from(gather![|ii| cparams[ii].impulse]);
|
let impulse = SpacialVector::from(gather![|ii| cparams[ii].impulse]);
|
||||||
|
|
||||||
let anchor1 = position1 * local_anchor1;
|
let anchor1 = position1 * local_frame1;
|
||||||
let anchor2 = position2 * local_anchor2;
|
let anchor2 = position2 * local_frame2;
|
||||||
let ii2 = ii2_sqrt.squared();
|
let ii2 = ii2_sqrt.squared();
|
||||||
let r1 = anchor1.translation.vector - world_com1.coords;
|
let r1 = anchor1.translation.vector - world_com1.coords;
|
||||||
let r2 = anchor2.translation.vector - world_com2.coords;
|
let r2 = anchor2.translation.vector - world_com2.coords;
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ impl GenericPositionConstraint {
|
|||||||
im2,
|
im2,
|
||||||
ii1,
|
ii1,
|
||||||
ii2,
|
ii2,
|
||||||
local_com1: rb1.mass_properties.local_com,
|
local_com1: rb1.local_mprops.local_com,
|
||||||
local_com2: rb2.mass_properties.local_com,
|
local_com2: rb2.local_mprops.local_com,
|
||||||
joint: *joint,
|
joint: *joint,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -215,7 +215,7 @@ impl GenericPositionGroundConstraint {
|
|||||||
position2: rb2.active_set_offset,
|
position2: rb2.active_set_offset,
|
||||||
im2: rb2.effective_inv_mass,
|
im2: rb2.effective_inv_mass,
|
||||||
ii2: rb2.effective_world_inv_inertia_sqrt.squared(),
|
ii2: rb2.effective_world_inv_inertia_sqrt.squared(),
|
||||||
local_com2: rb2.mass_properties.local_com,
|
local_com2: rb2.local_mprops.local_com,
|
||||||
joint: *joint,
|
joint: *joint,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,8 +51,8 @@ impl RevolutePositionConstraint {
|
|||||||
ii1,
|
ii1,
|
||||||
ii2,
|
ii2,
|
||||||
ang_inv_lhs,
|
ang_inv_lhs,
|
||||||
local_com1: mprops1.mass_properties.local_com,
|
local_com1: mprops1.local_mprops.local_com,
|
||||||
local_com2: mprops2.mass_properties.local_com,
|
local_com2: mprops2.local_mprops.local_com,
|
||||||
local_anchor1: cparams.local_anchor1,
|
local_anchor1: cparams.local_anchor1,
|
||||||
local_anchor2: cparams.local_anchor2,
|
local_anchor2: cparams.local_anchor2,
|
||||||
local_axis1: cparams.local_axis1,
|
local_axis1: cparams.local_axis1,
|
||||||
@@ -183,7 +183,7 @@ impl RevolutePositionGroundConstraint {
|
|||||||
local_anchor2,
|
local_anchor2,
|
||||||
im2: mprops2.effective_inv_mass,
|
im2: mprops2.effective_inv_mass,
|
||||||
ii2: mprops2.effective_world_inv_inertia_sqrt.squared(),
|
ii2: mprops2.effective_world_inv_inertia_sqrt.squared(),
|
||||||
local_com2: mprops2.mass_properties.local_com,
|
local_com2: mprops2.local_mprops.local_com,
|
||||||
axis1,
|
axis1,
|
||||||
local_axis2,
|
local_axis2,
|
||||||
position2: ids2.active_set_offset,
|
position2: ids2.active_set_offset,
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user