boxddd 0.4.0

Safe, ergonomic Rust bindings for Box3D
Documentation
use boxddd::prelude::*;

fn main() -> boxddd::Result<()> {
    let foundation = boxddd::Foundation::initialize_default()?;
    let mut world = foundation.create_world(
        foundation
            .world_def_builder()
            .gravity(nalgebra::Vector3::new(0.0, -9.8, 0.0))
            .build()?,
    )?;

    let start_position = nalgebra::Point3::<boxddd::types::PosScalar>::new(0.0, 2.0, 0.0);
    let body = world.create_body(
        foundation
            .body_def_builder()
            .body_type(BodyType::Dynamic)
            .position(start_position)
            .build()?,
    )?;
    world.create_sphere_shape(
        body,
        &foundation.shape_def_builder().density(1.0).build()?,
        &Sphere::new(nalgebra::Vector3::new(0.0, 0.0, 0.0), 0.25),
    )?;

    world.step(1.0 / 60.0, 4)?;

    let body_position: nalgebra::Point3<boxddd::types::PosScalar> =
        world.body_position(body)?.into();
    let rotation: nalgebra::UnitQuaternion<f32> = world.body_rotation(body)?.into();
    #[cfg(not(feature = "double-precision"))]
    let transform: nalgebra::Isometry3<f32> = world.body_transform(body)?.into();
    #[cfg(not(feature = "double-precision"))]
    let transform_x = transform.translation.vector.x;
    #[cfg(feature = "double-precision")]
    let transform_x = body_position.x;

    println!(
        "nalgebra_interop: y={:.3}, angle={:.3}, tx={:.3}",
        body_position.y,
        rotation.angle(),
        transform_x
    );
    Ok(())
}