rubullet 0.1.0-alpha-3

Rust interface to the Bullet Physics SDK simmilar to PyBullet
Documentation
use anyhow::Result;
use nalgebra::{Isometry3, Vector3};
use rubullet::*;
use std::time::Duration;

fn main() -> Result<()> {
    let mut physics_client = PhysicsClient::connect(Mode::Gui)?;
    physics_client.set_additional_search_path("../rubullet-sys/bullet3/libbullet3/data")?;
    physics_client.reset_simulation_with_flags(ResetFlags::DEFORMABLE_WORLD);

    physics_client.set_gravity([0., 0., -10.]);

    let cube_id = physics_client.load_urdf(
        "cube.urdf",
        UrdfOptions {
            base_transform: Isometry3::translation(0., 1., 2.),
            use_maximal_coordinates: Some(true),
            ..Default::default()
        },
    )?;
    let cloth_id = physics_client.load_soft_body(
        "cloth_z_up.obj",
        SoftBodyOptions {
            base_pose: Isometry3::translation(0., 0., 2.),
            scale: Some(0.5),
            mass: Some(1.),
            use_neo_hookean: false,
            use_bending_springs: true,
            use_mass_spring: true,
            spring_elastic_stiffness: 40.,
            spring_damping_stiffness: 0.1,
            spring_damping_all_directions: true,
            use_self_collision: false,
            friction_coeff: 0.5,
            use_face_contact: true,
            ..Default::default()
        },
    )?;

    physics_client.change_visual_shape(
        cloth_id,
        None,
        ChangeVisualShapeOptions {
            flags: Some(VisualShapeFlags::DOUBLE_SIDED),
            ..Default::default()
        },
    )?;

    physics_client.create_soft_body_anchor(cloth_id, 24, None, None, None)?;
    physics_client.create_soft_body_anchor(cloth_id, 20, None, None, None)?;
    physics_client.create_soft_body_anchor(
        cloth_id,
        15,
        cube_id,
        None,
        Vector3::new(0.5, -0.5, 0.),
    )?;
    physics_client.create_soft_body_anchor(
        cloth_id,
        19,
        cube_id,
        None,
        Vector3::new(-0.5, -0.5, 0.),
    )?;
    physics_client.set_physics_engine_parameter(SetPhysicsEngineParameterOptions {
        sparse_sdf_voxel_size: Some(0.25),
        ..Default::default()
    });

    physics_client.set_gravity([0., 0., -10.]);
    loop {
        std::thread::sleep(Duration::from_secs_f64(1. / 240.));
        physics_client.step_simulation()?;
    }
}