OYK is ODE (Open Dynamics Engine) bindings for Rust yaw kinetics
* https://github.com/nomissbowling/oyk/blob/master/img/oyk_512x424.png?raw=true
* https://github.com/nomissbowling/oyk/blob/master/img/oyk_512x100.png?raw=true
Now this crate is tested on ode-0.16.2 dll version.
ode.dll drawstuff.dll for x64 Windows binary compiled with -DdDOUBLE by mingw
(It may work with VC, or other platforms.)
to build dll
in the running directory
```rust use oyk::colors::; use oyk::ode::;
use std::ffi::{cvoid}; // used by implsimfn use implsim::{implsimfn, implsimderive};
pub struct SimApp { cnt: usize }
impl SimApp {
pub fn objsmut(&mut self, f: bool, s: &str) { let rode = self.supermut(); if f || rode.ismodified(false) { self.cnt = rode.num(); println!("obgs: {} in {}", self.cnt, s); let rode = self.superget(); // must re get let ids = rode.eachid(|key, id| { true }); // lambda may return false for id in ids { if id == 0 as dBodyID { continue; } // skipped by result of eachid let rode = self.supermut(); // must re get match rode.getmut(id) { Err(e) => { println!("{}", e); }, Ok(obg) => { // This is test code using eachid with getmut, but high cost. // Better to use self.supermut().findmut("ballbig".tostring()) if obg.key == "ballbig" { obg.col = [1.0, 0.0, 0.0, 0.8]; } println!("{}: {:018p} {:?}", obg.key, id, obg.col); // gettcmmut must be after accessing to obg members if obg.key == "ballbig" { let geom = obg.geom(); // must assign before gettcmmut let mgm = rode.getmgmmut(geom).unwrap(); // must care okor mgm.gettcm_mut().col = [1.0, 0.0, 0.0, 0.8]; } } } } } }
pub fn objsinfo(&mut self, f: bool, s: &str) { let rode = self.supermut(); if f || rode.ismodified(false) { self.cnt = rode.num(); println!("obgs: {} in {}", self.cnt, s); let rode = self.superget(); // must re get because borrow later self.cnt rode.each(|key, id, obg| { println!("{}: {:018p} {:?}", key, id, obg.col); true }); } }
/// create test balls pub fn createtestballs(&mut self) { let m: dReal = 0.8; let r: dReal = 0.2; for i in 0..16 { let c: dVector4 = vec4fromu32(COLORS[i]); let p: dVector3 = [(i%4) as dReal - 1.5, (i/4) as dReal - 1.5, 2.0, 1.0]; let mib = MetaSphere::new(m, r, KRP095, 0, c); let (body, , _) = self.supermut().creatorm( format!("ball{:08X}", i).asstr(), mib); self.setpos_Q(body, p, QI); } }
/// create test ball big pub fn createtestballbig(&mut self) { let c: dVector4 = [1.0, 1.0, 0.0, 0.8]; let p: dVector3 = [0.0, 0.0, 10.0, 1.0]; let mib = MetaSphere::new(0.08 / (125.0 * PIt4), 1.0, KRP095, 0, c); let (body, _, _) = self.supermut().creator("ballbig", mib); self.setpos_Q(body, p, QI); }
/// create test box small pub fn createtestboxsmall(&mut self) { let miboxsmall = MetaBox::new(0.1, [1.0, 1.0, 1.0, 0.0], KRP095, 0, [0.0, 1.0, 1.0, 0.8]); let (body, , _) = self.supermut().creator("boxsmall", miboxsmall); self.setposQ(body, [-5.0, 5.0, 2.0, 1.0], QI); }
/// create test box frames pub fn createtestboxframes(&mut self) { let miboxbig0 = MetaBox::new(0.1, [1.0, 5.0, 0.5, 0.0], KRP095, 0, [1.0, 0.0, 1.0, 0.8]); let (body, _, _) = self.supermut().creator("boxbig0", miboxbig0); self.setposR(body, [-9.0, -11.0, 2.0, 1.0], dMatrix3::fromaxisand_angle([0.0, 0.0, 1.0], PIx));
let miboxbig1 = MetaBox::new(0.1, [1.0, 12.0, 0.5, 0.0], KRP095, 0, [0.0, 1.0, 0.0, 0.8]); let (body, , _) = self.supermut().creator("boxbig1", miboxbig1); self.setposR(body, [12.0, -12.0, 2.0, 1.0], dMatrix3::fromaxisand_angle([0.0, 0.0, 1.0], -PIq));
let miboxbig2 = MetaBox::new(0.1, [1.0, 12.0, 0.5, 0.0], KRP095, 0, [0.0, 1.0, 1.0, 0.8]); let (body, , _) = self.supermut().creator("boxbig2", miboxbig2); self.setposR(body, [12.0, 12.0, 2.0, 1.0], dMatrix3::fromaxisand_angle([0.0, 0.0, 1.0], PIq));
let miboxbig3 = MetaBox::new(0.1, [1.0, 12.0, 0.5, 0.0], KRP095, 0, [0.0, 0.0, 1.0, 0.8]); let (body, , _) = self.supermut().creator("boxbig3", miboxbig3); self.setposR(body, [-12.0, 12.0, 2.0, 1.0], dMatrix3::fromaxisand_angle([0.0, 0.0, 1.0], -PIq)); }
/// create test capsule frames pub fn createtestcapsuleframes(&mut self) { let micap0 = MetaCapsule::new(0.001, 0.5, 16.0, KRP080, 0, [0.0, 1.0, 0.0, 0.8]); let (body, , _) = self.supermut().creator("capsule0", micap0); self.setposR(body, [-8.6, 0.0, 1.5, 1.0], dMatrix3::fromaxisand_angle([1.0, 0.0, 0.0], PIh));
let micap1 = MetaCapsule::new(0.001, 0.5, 16.0, KRP080, 0, [0.0, 0.0, 1.0, 0.8]); let (body, _, _) = self.supermut().creator("capsule1", micap1); self.setposR(body, [8.6, 0.0, 1.5, 1.0], dMatrix3::fromaxisand_angle([1.0, 0.0, 0.0], PIh)); }
/// create test cylinder frames pub fn createtestcylinderframes(&mut self) { let micyl0 = MetaCylinder::new(0.001, 0.5, 16.0, KRP080, 0, [1.0, 0.0, 1.0, 0.8]); let (body, , _) = self.supermut().creator("cylinder0", micyl0); self.setposR(body, [0.0, 8.6, 1.5, 1.0], dMatrix3::fromaxisand_angle([0.0, 1.0, 0.0], PIh));
let micyl1 = MetaCylinder::new(0.001, 0.5, 16.0, KRP080, 0, [0.0, 1.0, 1.0, 0.8]); let (body, _, _) = self.supermut().creator("cylinder1", micyl1); self.setposR(body, [0.0, -8.6, 1.5, 1.0], dMatrix3::fromaxisand_angle([0.0, 1.0, 0.0], PIh)); }
/// create test composite pub fn createtestcomposite(&mut self) { let micmp0 = MetaComposite::new( vec![ MetaBox::new(0.1, [0.5, 0.5, 0.5, 0.0], KRP095, 0, [1.0, 0.0, 0.0, 0.8]), MetaBox::new(0.1, [0.5, 0.5, 0.5, 0.0], KRP095, 0, [0.0, 0.0, 1.0, 0.8]), MetaSphere::new(0.6 / PI, 0.5, KRP095, 0, [0.0, 1.0, 0.0, 0.8]), MetaSphere::new(0.0001, 0.1, KRPnk, 0, [1.0, 0.0, 1.0, 0.8])], vec![QI, QI, QI, QI], vec![ [-0.4, -0.4, -0.4, 1.0], [0.4, 0.4, 0.4, 1.0], [0.0, 0.0, 0.0, 1.0], [0.0, 0.0, 0.0, 1.0]], KRPnk, 0, [1.0, 0.0, 0.0, 0.8]); let (body, _, _) = self.supermut().creatorcomposite("composite0", micmp0); self.setposQ(body, [-12.0, -2.0, 2.0, 1.0], dQuaternion::fromaxisandangle([0.0, 0.0, 1.0], -PIq3));
let micmp1 = MetaComposite::new( vec![ MetaBox::new(0.1, [0.5, 0.5, 0.5, 0.0], KRP095, 0, [1.0, 0.0, 0.0, 0.8]), MetaBox::new(0.1, [0.5, 0.5, 0.5, 0.0], KRP095, 0, [0.0, 0.0, 1.0, 0.8]), MetaSphere::new(0.6 / PI, 0.5, KRP095, 0, [0.0, 1.0, 0.0, 0.8])], vec![ dQuaternion::fromaxisandangle([-0.707, 0.707, 0.0], PIq), dQuaternion::fromaxisandangle([0.707, -0.707, 0.0], -PIq), dQuaternion::new()], vec![ [-0.4, -0.4, -0.4, 1.0], [0.4, 0.4, 0.4, 1.0], [0.0, 0.0, 0.0, 1.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, _, _) = self.supermut().creatorcomposite("composite1", micmp1); self.setposQ(body, [-12.0, 0.0, 2.0, 1.0], dQuaternion::fromaxisandangle([0.0, 0.0, 1.0], -PIq3)); }
/// create test custom pub fn createtestcustom(&mut self) { let mitmvcus0 = MetaTriMesh::new(false, 0.1, unsafe { &mut *custom::tmv }, KRP095, 0, [1.0, 0.5, 0.5, 0.8]); let (body, , _) = self.supermut().creator("tmvcus0", mitmvcus0); self.setposQ(body, [-13.0, 6.0, 2.0, 1.0], QI);
let mifvpcus0 = MetaConvex::new(false, 0.1, unsafe { &mut *custom::fvp }, KRP095, 0, [0.5, 0.5, 1.0, 0.8]); let (body, , _) = self.supermut().creator("fvpcus0", mifvpcus0); self.setposQ(body, [-13.0, 8.0, 2.0, 1.0], QI); }
/// create test tetra pub fn createtesttetra(&mut self) { let mitmvtetra0 = MetaTriMesh::new(false, 0.1, unsafe { &mut *tetra::tmv }, KRP095, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creator("tmvtetra0", mitmvtetra0); self.setposQ(body, [-13.0, -6.0, 2.0, 1.0], QI);
let mifvptetra0 = MetaConvex::new(false, 0.1, unsafe { &mut *tetra::fvp }, KRP095, 0, [0.0, 0.0, 1.0, 0.8]); let (body, , _) = self.supermut().creator("fvptetra0", mifvptetra0); self.setposQ(body, [-13.0, -8.0, 2.0, 1.0], QI); }
/// create test cube pub fn createtestcube(&mut self) { let mitmvcube0 = MetaTriMesh::new(false, 0.1, unsafe { &mut *cube::tmv }, KRP095, 0, [1.0, 1.0, 0.0, 0.8]); let (body, , _) = self.supermut().creator("tmvcube0", mitmvcube0); self.setposQ(body, [-7.0, 1.0, 2.0, 1.0], QI);
let mifvpcube0 = MetaConvex::new(false, 0.1, unsafe { &mut *cube::fvp }, KRP095, 0, [1.0, 0.0, 1.0, 0.8]); let (body, , _) = self.supermut().creator("fvpcube0", mifvpcube0); self.setposQ(body, [-7.0, -1.0, 2.0, 1.0], QI); }
/// create test icosahedron pub fn createtesticosahedron(&mut self) { let mitmvih0 = MetaTriMesh::new(false, 0.1, unsafe { &mut *icosahedron::tmv }, KRP095, 0, [0.0, 1.0, 1.0, 0.8]); let (body, , _) = self.supermut().creator("tmvicosahedron0", mitmvih0); self.setposQ(body, [-7.0, 3.0, 2.0, 1.0], QI);
let mifvpih0 = MetaConvex::new(false, 0.1, unsafe { &mut *icosahedron::fvp }, KRP095, 0, [1.0, 1.0, 0.0, 0.8]); let (body, , _) = self.supermut().creator("fvpicosahedron0", mifvpih0); self.setposQ(body, [-7.0, -3.0, 2.0, 1.0], QI); }
/// create test bunny pub fn createtestbunny(&mut self) { let q = dQuaternion::fromaxisand_angle([1.0, 0.0, 0.0], PIh);
let mitmvbunny0 = MetaTriMesh::new(false, 0.1, unsafe { &mut *bunny::tmv }, KRP095, 0, [1.0, 0.0, 1.0, 0.8]); let (body, , _) = self.supermut().creator("tmvbunny0", mitmvbunny0); self.setposQ(body, [-4.0, 2.0, 2.0, 1.0], q);
// unsafe { RecalcFaces(&mut *bunny::fvp as *mut convexfvp); } // old let mifvpbunny0 = MetaConvex::new(false, 0.1, unsafe { &mut *bunny::fvp }, KRP095, 0, [0.0, 1.0, 1.0, 0.8]); let (body, , _) = self.supermut().creator("fvpbunny0", mifvpbunny0); self.setposQ(body, [-4.0, -2.0, 2.0, 1.0], q); }
/// create test plane pub fn createtestplane(&mut self) { let rode = self.supermut(); let dm: dReal = 0.1; let lxyz: dVector3 = [10.0, 10.0, 0.05, 0.0]; let norm: dVector4 = [0.0, 0.0, 1.0, 0.0]; let col: dVector4 = vec4fromu32(COLORS[0]); let pos: dVector3 = [-5.0, -5.0, 5.0, 0.0]; let mip = MetaPlane::new(dm, lxyz, norm, KRPnk, 0, col); let (body, _, _) = rode.creator("plane", mip); let q = dQuaternion::fromaxisandangle([1.0, 1.0, 0.0], PIq); rode.getmut(body).expect("fail reg").setpos(pos) // .setrot(dMatrix3::fromzaxis([0.7, 0.7, 0.0])); // .setrot(dMatrix3::from2axes([-0.7, 0.7, 0.0], [0.7, 0.7, 0.0])); // .setrot(dMatrix3::fromeulerangles(PIq, PIq, PIq)); // .setrot(dMatrix3::fromaxisandangle([0.0, 0.0, 1.0], PIq)); // .setrot(dMatrix3::new()); // .setrot(dMatrix3::fromQ(dQuaternion::new())); // .setrot(dQuaternion::new().toR()); // .setquaternion(dMatrix3::new().toQ()); // .setquaternion(dQuaternion::fromR(dMatrix3::new())); // .setquaternion(dQuaternion::new()); // .setquaternion(q); .setrot(q.toR()); }
/// create pub fn createtmball(&mut self) { let mitmball = MetaComposite::new( vec![ MetaTriMesh::new(false, 0.1, unsafe { &mut *bunny::tmv }, KRP095, 0, [1.0, 0.8, 0.2, 0.6]), MetaSphere::new(0.1, 1.2, KRP095, 0, [0.2, 1.0, 0.8, 0.4])], vec![QI, QI], vec![[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creatorcomposite("tmball", mitmball); let p = dQuaternion::fromaxisandangle([0.0, 0.0, 1.0], PIh); let q = dQuaternion::fromaxisandangle([1.0, 0.0, 0.0], PIh); let o = dQuaternion::multiply0(p, q); self.setposQ(body, [-29.0, -3.0, 3.0, 1.0], o); }
/// create pub fn createslope(&mut self) { let mislope = MetaComposite::new( vec![ MetaBox::new(1.0, [6.0, 0.1, 8.0, 0.0], KRP001, 0, [1.0, 0.8, 0.2, 0.6]), MetaCylinder::new(1.0, 1.0, 2.0, KRP001, 0, [0.2, 1.0, 0.8, 0.4])], vec![QI, QI], vec![[0.0, 0.0, 0.0, 0.0], [-3.0, 0.0, 0.0, 0.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creatorcomposite("slope", mislope); let p = dQuaternion::fromaxisandangle([0.0, 1.0, 0.0], PIx / 3.0); let q = dQuaternion::fromaxisandangle([1.0, 0.0, 0.0], PIh); let o = dQuaternion::multiply0(p, q); self.setposQ(body, [-28.5, 0.0, 1.2, 1.0], o); }
/// create x, y on the bunny pub fn createsphereapple(&mut self) { let krp = Krp::new(true, false, true, 0.95); let miapple = MetaSphere::new(0.1, 0.2, krp, 0, [0.8, 0.4, 0.4, 0.8]); let (body, _, _) = self.supermut().creator("apple", miapple); self.setpos_Q(body, [-15.15, 0.31, 2.5, 1.0], QI); }
/// create pub fn createsphereball(&mut self) { let miball = MetaSphere::new(0.1, 0.1, KRP080, 0, [0.4, 0.4, 0.8, 0.8]); let z = miball.r; let (body, , _) = self.supermut().creator("ball", miball); self.setpos_Q(body, [-14.5, 0.0, z, 1.0], QI); }
/// create on the slope pub fn createsphereroll(&mut self) { let miroll = MetaSphere::new(0.1, 0.2, KRP080, 0, [0.4, 0.8, 0.4, 0.8]); let (body, _, _) = self.supermut().creator("roll", miroll); self.setpos_Q(body, [-27.0, 0.0, 1.2, 1.0], QI); }
/// create Rin, Rout pub fn createuball(&mut self) { let miuball = MetaComposite::new( vec![ MetaSphere::new(1.0, 0.1, KRP001, 0, [0.6, 0.2, 0.8, 0.6]), MetaSphere::new(1.0, 0.2, KRP001, 0, [0.2, 0.8, 0.6, 0.4])], vec![QI, QI], vec![[0.05, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creatorcomposite("Uball", miuball); self.setposQ(body, [-27.0, 0.5, 1.2, 1.0], QI); }
/// create Rin, Rout pub fn createluball(&mut self) { let miluball = MetaComposite::new( vec![ MetaSphere::new(1.0, 0.1, KRP001, 0, [0.6, 0.2, 0.8, 0.6]), MetaSphere::new(1.0, 0.2, KRP001, 0, [0.2, 0.8, 0.6, 0.4])], vec![QI, QI], vec![[0.05, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creatorcomposite("LUball", miluball); let q = dQuaternion::fromaxisandangle([0.0, 0.0, 1.0], PIh); self.setpos_Q(body, [-27.0, 2.5, 1.2, 1.0], q); }
/// create Rin, Rout pub fn createruball(&mut self) { let miruball = MetaComposite::new( vec![ MetaSphere::new(1.0, 0.1, KRP001, 0, [0.6, 0.2, 0.8, 0.6]), MetaSphere::new(1.0, 0.2, KRP001, 0, [0.2, 0.8, 0.6, 0.4])], vec![QI, QI], vec![[0.05, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creatorcomposite("RUball", miruball); let q = dQuaternion::fromaxisandangle([0.0, 0.0, 1.0], -PIh); self.setpos_Q(body, [-27.0, -0.5, 1.2, 1.0], q); }
/// create lxyz, RL, Rout pub fn createvball(&mut self) { let mivball = MetaComposite::new( vec![ MetaBox::new(1.0, [0.2, 0.1, 0.1, 0.0], KRP001, 0, [0.6, 0.2, 0.8, 0.6]), MetaCapsule::new(1.0, 0.05, 0.2, KRP001, 0, [0.8, 0.2, 0.6, 0.6]), MetaSphere::new(1.0, 0.2, KRP001, 0, [0.2, 0.8, 0.6, 0.4])], vec![QI, QI, QI], vec![[0.05, 0.0, 0.0, 0.0], [0.0, 0.0, 0.03, 0.0], [0.0, 0.0, 0.0, 0.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creatorcomposite("Vball", mivball); self.setposQ(body, [-27.0, 1.5, 1.2, 1.0], QI); }
/// create lxyz, RL, Rout pub fn createlvball(&mut self) { let milvball = MetaComposite::new( vec![ MetaBox::new(1.0, [0.2, 0.1, 0.1, 0.0], KRP001, 0, [0.6, 0.2, 0.8, 0.6]), MetaCapsule::new(1.0, 0.05, 0.2, KRP001, 0, [0.8, 0.2, 0.6, 0.6]), MetaSphere::new(1.0, 0.2, KRP001, 0, [0.2, 0.8, 0.6, 0.4])], vec![QI, QI, QI], vec![[0.05, 0.0, 0.0, 0.0], [0.0, 0.0, 0.03, 0.0], [0.0, 0.0, 0.0, 0.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creatorcomposite("LVball", milvball); let q = dQuaternion::fromaxisandangle([0.0, 0.0, 1.0], PIh); self.setpos_Q(body, [-27.0, 3.5, 1.2, 1.0], q); }
/// create lxyz, RL, Rout pub fn creatervball(&mut self) { let mirvball = MetaComposite::new( vec![ MetaBox::new(1.0, [0.2, 0.1, 0.1, 0.0], KRP001, 0, [0.6, 0.2, 0.8, 0.6]), MetaCapsule::new(1.0, 0.05, 0.2, KRP001, 0, [0.8, 0.2, 0.6, 0.6]), MetaSphere::new(1.0, 0.2, KRP001, 0, [0.2, 0.8, 0.6, 0.4])], vec![QI, QI, QI], vec![[0.05, 0.0, 0.0, 0.0], [0.0, 0.0, 0.03, 0.0], [0.0, 0.0, 0.0, 0.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creatorcomposite("RVball", mirvball); let q = dQuaternion::fromaxisandangle([0.0, 0.0, 1.0], -PIh); self.setpos_Q(body, [-27.0, -1.5, 1.2, 1.0], q); }
/// create 4 * lxyz, Rout (Radius of Gyration) RG High Inertia (slow) pub fn createihball(&mut self) { let c: dVector4 = [1.0, 0.8, 0.2, 0.6]; let miihball = MetaComposite::new( vec![ MetaBox::new(100.0, [0.1, 0.1, 0.1, 0.0], KRP001, 0, c), MetaBox::new(100.0, [0.1, 0.1, 0.1, 0.0], KRP001, 0, c), MetaBox::new(100.0, [0.1, 0.1, 0.1, 0.0], KRP001, 0, c), MetaBox::new(100.0, [0.1, 0.1, 0.1, 0.0], KRP001, 0, c), MetaSphere::new(1.0, 0.2, KRP001, 0, [0.2, 1.0, 0.8, 0.4])], vec![QI, QI, QI, QI, QI], vec![ [0.09, 0.0, 0.0, 0.0], [0.0, 0.0, 0.09, 0.0], [-0.09, 0.0, 0.0, 0.0], [0.0, 0.0, -0.09, 0.0], [0.0, 0.0, 0.0, 0.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creatorcomposite("IHball", miihball); self.setposQ(body, [-27.0, -2.5, 1.2, 1.0], QI); }
/// create 4 * lxyz, Rout (Radius of Gyration) RG Low Inertia (fast) pub fn createilball(&mut self) { let c: dVector4 = [1.0, 0.8, 0.2, 0.6]; let miilball = MetaComposite::new( vec![ MetaBox::new(100.0, [0.1, 0.1, 0.1, 0.0], KRP001, 0, c), MetaBox::new(100.0, [0.1, 0.1, 0.1, 0.0], KRP001, 0, c), MetaBox::new(100.0, [0.1, 0.1, 0.1, 0.0], KRP001, 0, c), MetaBox::new(100.0, [0.1, 0.1, 0.1, 0.0], KRP001, 0, c), MetaSphere::new(1.0, 0.2, KRP001, 0, [0.2, 1.0, 0.8, 0.4])], vec![QI, QI, QI, QI, QI], vec![ [0.05, 0.0, 0.0, 0.0], [0.0, 0.0, 0.05, 0.0], [-0.05, 0.0, 0.0, 0.0], [0.0, 0.0, -0.05, 0.0], [0.0, 0.0, 0.0, 0.0]], KRP100, 0, [1.0, 0.0, 0.0, 0.8]); let (body, , _) = self.supermut().creatorcomposite("ILball", miilball); self.setposQ(body, [-27.0, -3.5, 1.2, 1.0], QI); }
/// create pub fn createtmtetra(&mut self) { let mitmtetra = MetaTriMesh::new(false, 1.0, unsafe { &mut *tetra::tmv }, KRP095, 0, [0.8, 0.6, 0.2, 1.0]); let (body, , _) = self.supermut().creator("tmtetra", mitmtetra); self.setpos_Q(body, [-15.0, -1.5, 0.5, 1.0], QI); }
/// create pub fn createtetra(&mut self) { let mitetra = MetaConvex::new(false, 1.0, unsafe { &mut *tetra::fvp }, KRP095, 0, [0.4, 0.8, 0.4, 1.0]); let (body, , _) = self.supermut().creator("tetra", mitetra); self.setpos_Q(body, [-15.0, 1.5, 0.5, 1.0], QI); }
/// create pub fn createtmcube(&mut self) { let mitmcube = MetaTriMesh::new(false, 1.0, unsafe { &mut *cube::tmv }, KRP095, 0, [0.6, 0.8, 0.2, 1.0]); let (body, , _) = self.supermut().creator("tmcube", mitmcube); self.setposQ(body, [-16.5, -3.0, 0.5, 1.0], dQuaternion::fromaxisandangle([1.0, 1.0, 1.0], PIq)); }
/// create pub fn createcube(&mut self) { let micube = MetaConvex::new(false, 1.0, unsafe { &mut *cube::fvp }, KRP095, 0, [0.8, 0.8, 0.4, 1.0]); let (body, , _) = self.supermut().creator("cube", micube); self.setposQ(body, [-16.5, -1.5, 0.5, 1.0], dQuaternion::fromaxisandangle([1.0, 1.0, 1.0], PIq)); }
/// create pub fn createtmicosahedron(&mut self) { let mitmih = MetaTriMesh::new(false, 1.0, unsafe { &mut *icosahedron::tmv }, KRP095, 0, [0.2, 0.8, 0.6, 1.0]); let (body, , _) = self.supermut().creator("tmicosahedron", mitmih); self.setpos_Q(body, [-16.5, 3.0, 0.5, 1.0], QI); }
/// create pub fn createicosahedron(&mut self) { let miih = MetaConvex::new(false, 1.0, unsafe { &mut *icosahedron::fvp }, KRP095, 0, [0.4, 0.8, 0.8, 1.0]); let (body, , _) = self.supermut().creator("icosahedron", miih); self.setpos_Q(body, [-16.5, 1.5, 0.5, 1.0], QI); }
/// create pub fn createtmbunny(&mut self) { let mitmbunny = MetaTriMesh::new(false, 1.0, unsafe { &mut *bunny::tmv }, KRP095, 0, [0.8, 0.2, 0.6, 1.0]); let (body, , _) = self.supermut().creator("tmbunny", mitmbunny); // phi=-x, theta=-y, psi=-z let m = dMatrix3::fromeulerangles(-PIh, 0.0, 0.0); self.setposQ(body, [-15.0, 0.25, 0.88, 1.0], dQuaternion::fromR(m)); // to (-0.109884, 0.304591, 1.217693) }
/// create pub fn createbunny(&mut self) { let mibunny = MetaConvex::new(false, 1.0, unsafe { &mut *bunny::fvp }, KRP095, 0, [0.8, 0.4, 0.8, 1.0]); let (body, , _) = self.supermut().creator("bunny", mibunny); self.setpos_Q(body, [-18.0, -1.5, 2.0, 1.0], QI); }
/// create pub fn createtmcustom(&mut self) { let mitmcustom = MetaTriMesh::new(false, 1.0, unsafe { &mut *custom::tmv }, KRP095, 0, [0.6, 0.2, 0.8, 1.0]); let (body, , _) = self.supermut().creator("tmcustom", mitmcustom); self.setpos_Q(body, [-18.0, 3.0, 0.5, 1.0], QI); }
/// create pub fn createcustom(&mut self) { let micustom = MetaConvex::new(false, 1.0, unsafe { &mut *custom::fvp }, KRP095, 0, [0.2, 0.6, 0.8, 1.0]); let (body, , _) = self.supermut().creator("custom", micustom); self.setpos_Q(body, [-18.0, 1.5, 0.5, 1.0], QI); }
/// create pub fn createtmbunny2(&mut self) { let mitmbunny2 = MetaTriMesh::new(false, 1.0, unsafe { &mut *bunny::tmv }, KRP095, 0, [0.8, 0.2, 0.6, 1.0]); let (body, , _) = self.supermut().creator("tmbunny2", mitmbunny2); let m = dMatrix3::fromaxisandangle([1.0, 0.0, 0.0], PIh); let n = dMatrix3::fromaxisandangle([0.0, 0.0, 1.0], PIh); self.setposR(body, [-18.0, -5.0, 2.0, 1.0], dMatrix3::multiply0333(n, m)); }
/// create pub fn createtmbunny3(&mut self) { let mitmbunny3 = MetaTriMesh::new(false, 1.0, unsafe { &mut *bunny::tmv }, KRP095, 0, [0.8, 0.2, 0.6, 1.0]); let (body, , _) = self.supermut().creator("tmbunny3", mitmbunny3); let m = dMatrix3::fromaxisandangle([1.0, 0.0, 0.0], PIh); let n = dMatrix3::fromaxisandangle([0.0, 1.0, 0.0], PIh); self.setposR(body, [-18.0, -6.0, 2.0, 1.0], dMatrix3::multiply0333(m, n)); }
/// create pub fn createbunny2(&mut self) { let mibunny2 = MetaConvex::new(false, 1.0, unsafe { &mut *bunny::fvp }, KRP095, 0, [0.8, 0.4, 0.8, 1.0]); let (body, , _) = self.supermut().creator("bunny2", mibunny2); let m = dMatrix3::fromaxisandangle([1.0, 0.0, 0.0], PIh); let n = dMatrix3::fromaxisandangle([0.0, 0.0, 1.0], PIh); self.setposR(body, [-18.0, -3.0, 2.0, 1.0], dMatrix3::multiply0333(n, m)); }
/// create pub fn createbunny3(&mut self) { let mibunny3 = MetaConvex::new(false, 1.0, unsafe { &mut *bunny::fvp }, KRP095, 0, [0.8, 0.4, 0.8, 1.0]); let (body, , _) = self.supermut().creator("bunny3", mibunny3); let m = dMatrix3::fromaxisandangle([1.0, 0.0, 0.0], PIh); let n = dMatrix3::fromaxisandangle([0.0, 1.0, 0.0], PIh); self.setposR(body, [-18.0, -4.0, 2.0, 1.0], dMatrix3::multiply0333(m, n)); }
}
impl Sim for SimApp {
fn drawobjects(&mut self) { self.objsinfo(false, "draw"); // twice (after step) self.supermut().drawobjects(); }
fn startcallback(&mut self) { let tdelta = &mut self.supermut().tdelta; *tdelta = 0.002; self.createtestballs(); self.createtestballbig(); self.createtestboxsmall(); self.createtestboxframes(); self.createtestcapsuleframes(); self.createtestcylinderframes(); self.createtestcomposite(); self.createtestcustom(); self.createtesttetra(); self.createtestcube(); self.createtesticosahedron(); self.createtestbunny(); self.createtestplane();
self.createtmball(); self.createslope(); self.createsphereapple(); self.createsphereball(); self.createsphereroll(); self.createuball(); self.createluball(); self.createruball(); self.createvball(); self.createlvball(); self.creatervball(); self.createihball(); self.createilball(); self.createtmtetra(); self.createtetra(); self.createtmcube(); self.createcube(); self.createtmicosahedron(); self.createicosahedron(); self.createtmbunny(); self.createbunny(); self.createtmcustom(); self.createcustom(); self.createtmbunny2(); self.createtmbunny3(); self.createbunny2(); self.createbunny3();
self.supermut().startcallback(); }
fn stepcallback(&mut self, pause: i32) { self.objsinfo(false, "step"); // twice (before draw) self.supermut().stepcallback(pause); }
fn commandcallback(&mut self, cmd: i32) { match cmd as u8 as char { ' ' => { let k = "apple"; match self.supermut().findmut(k.tostring()) { Err(e) => { println!("{}", e); }, Ok(obg) => { if obg.isenabled() { obg.disable(); } else { obg.enable(); } } } }, 't' => { for k in ["ballbig", "boxsmall", "apple", "roll", "tmball", "cube", "icosahedron", "custom"] { match self.supermut().findmut(k.tostring()) { Err(e) => { println!("{}", e); }, Ok(obg) => { // obg.addreltorque([-0.5, 0.0, 0.0]); obg.addrelforcerel([-0.5, 0.0, 0.0], [0.0, 0.0, 0.5]); } } } for k in ["ball", "tmbunny", "bunny", "tmtetra", "tetra", "tmcube", "tmicosahedron", "tmcustom"] { match self.supermut().findmut(k.tostring()) { Err(e) => { println!("{}", e); }, Ok(obg) => { // obg.addreltorque([0.0, 0.0, 0.5]); obg.addrelforcerel([0.0, 0.0, 0.5], [0.5, 0.0, 0.0]); } } } }, 'o' => { let k = "ballbig"; match self.supermut().findmut(k.tostring()) { Err(e) => { println!("{}", e); }, Ok(obg) => { println!("{}: {:018p} {:?}", k, obg.body(), obg.col); println!(" pos: {}", obg.posvec()); println!(" rot: {}", obg.rotmat3()); let pos: &mut [dReal] = obg.pos(); // re get mut pos[0] += 0.2; pos[1] += 0.2; pos[2] = 5.0; } } }, 'b' => { self.objsmut(true, "mut"); }, 'a' => { self.objsinfo(true, "cmd"); }, _ => {} } self.supermut().commandcallback(cmd); }
} // impl Sim for SimApp
fn main() { ODE::open(); ODE::sim_loop( 640, 480, // 800, 600, Some(Box::new(SimApp{cnt: 0})), b"./resources"); ODE::close(); } ```
see also
MIT License