use std::{thread, time::Duration};
use anyhow::Result;
use nalgebra::{Isometry3, Vector3};
use rubullet::*;
use std::path::PathBuf;
fn main() -> Result<()> {
let mut physics_client = PhysicsClient::connect(Mode::Gui)?;
physics_client.set_additional_search_path("../rubullet-sys/bullet3/libbullet3/data")?;
physics_client.set_gravity(Vector3::new(0.0, 0.0, -10.0));
physics_client.set_time_step(Duration::from_secs_f64(1. / 120.));
let _plane_id = physics_client.load_urdf("plane100.urdf", None)?;
let shift = Isometry3::translation(0.0, -0.02, 0.0);
let visual_shape = physics_client.create_visual_shape(
GeometricVisualShape::MeshFile {
filename: PathBuf::from("duck.obj"),
mesh_scaling: Some(Vector3::from_element(0.1)),
},
VisualShapeOptions {
specular_colors: [0.4, 0.4, 0.],
frame_offset: shift.clone(),
..Default::default()
},
)?;
let collision_shape = physics_client.create_collision_shape(
GeometricCollisionShape::MeshFile {
filename: PathBuf::from("duck_vhacd.obj"),
mesh_scaling: Some(Vector3::from_element(0.1)),
flags: None,
},
shift,
)?;
let mesh_scaling = Vector3::from_element(0.1);
let rangex = 1;
let rangey = 1;
for i in 0..rangex {
for j in 0..rangey {
let _duck = physics_client.create_multi_body(
collision_shape,
visual_shape,
MultiBodyOptions {
base_pose: Isometry3::translation(
((-rangex as f64 / 2.) + i as f64) * mesh_scaling[0] * 2.,
((-rangey as f64 / 2.) + j as f64) * mesh_scaling[1] * 2.,
1.,
),
base_mass: 1.,
..Default::default()
},
)?;
}
}
physics_client.set_real_time_simulation(true);
for _ in 0..10000 {
thread::sleep(Duration::from_secs_f64(1. / 240.));
}
Ok(())
}