Struct skelly::Skelly[][src]

pub struct Skelly<T: Scalar, D = ()> { /* fields omitted */ }
Expand description

One’s skeleton. Parameterized with numric value and bone userdata type.

Implementations

Returns new empty skelly.

Example

let skelly = Skelly::<f32>::new();

Creates new root bone in the skelly at specified position.

Root bones are ones that have no parent bone.
Returns id of the added root bone.
userdata will be associated with the bone. It maybe be accessed with Skelly::get_userdata and Skelly::get_userdata_mut using returned id.

Example

let mut skelly = Skelly::<f32, &str>::new();
let root = skelly.add_root_with(Point3::origin(), "root-user-data");

Attaches new bone to an existing bone with specified id.

Returns id of the added bone.
The bone will be placed relative to its parent.
userdata will be associated with the bone. It maybe be accessed with Skelly::get_userdata and Skelly::get_userdata_mut using returned id.

Example

let mut skelly = Skelly::<f32, &str>::new();
let root = skelly.add_root_with(Point3::origin(), "root-user-data");
let bone = skelly.attach_with(Vector3::x(), root, "bone-user-data");

Panics

This method panics if parent index is out of bounds.

Rotates bone with specified id.

Does not affect relative position to the parent and global position for root bones. Affects global position of all descendant bones.

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let bone = skelly.attach(Vector3::x(), root);

let mut globals = [Isometry3::identity(); 2];
skelly.write_globals(&Isometry3::identity(), &mut globals);
let bone_global_old = globals[bone];

// Ensure that bone is placed correctly in global space at (1, 0, 0).
assert!((bone_global_old.translation.vector - Vector3::x()).magnitude() < EPSILON);

// Rotate root bone. It is still at origin.
// Yet global position of the `bone` attached to `root` has changed accordingly.
skelly.append_rotation(root, UnitQuaternion::from_euler_angles(0.0, 0.0, PI / 2.0));

skelly.write_globals(&Isometry3::identity(), &mut globals);
let bone_global_new = globals[bone];

// Ensure that bone is placed correctly in global space after root rotation at (0, 1, 0).
assert!((bone_global_new.translation.vector - Vector3::y()).magnitude() < EPSILON);

Panics

This method panics if bone index is out of bounds.

Rotates bone with specified id.

Affect relative position to the parent and global position for root bones. Affects global position of all descendant bones.

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let bone = skelly.attach(Vector3::x(), root);

let mut globals = [Isometry3::identity(); 2];
skelly.write_globals(&Isometry3::identity(), &mut globals);
let bone_global_old = globals[bone];

// Ensure that bone is placed correctly in global space at (1, 0, 0).
assert!((bone_global_old.translation.vector - Vector3::x()).magnitude() < EPSILON);

// Rotate the bone. It is still at origin.
// Yet global position of the `bone` attached to `root` has changed accordingly.
skelly.prepend_rotation(bone, UnitQuaternion::from_euler_angles(0.0, 0.0, PI / 2.0));

skelly.write_globals(&Isometry3::identity(), &mut globals);
let bone_global_new = globals[bone];

// Ensure that bone is placed correctly in global space after root rotation at (0, 1, 0).
assert!((bone_global_new.translation.vector - Vector3::y()).magnitude() < EPSILON);

Panics

This method panics if bone index is out of bounds.

Translates bone with specified id.

Affects relative position to the parent and global position for root bones. Affects global position of all descendant bones.

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let bone = skelly.attach(Vector3::x(), root);

let mut globals = [Isometry3::identity(); 2];
skelly.write_globals(&Isometry3::identity(), &mut globals);
let bone_global_old = globals[bone];

// Ensure that bone is placed correctly in global space at (1, 0, 0).
assert!((bone_global_old.translation.vector - Vector3::x()).magnitude() < EPSILON);

// Translate root bone.
// Global position of the `bone` attached to `root` has changed accordingly.
skelly.append_translation(root, Vector3::z().into());

skelly.write_globals(&Isometry3::identity(), &mut globals);
let bone_global_new = globals[bone];

// Ensure that bone is placed correctly in global space after root translation at (1, 0, 1).
assert!((bone_global_new.translation.vector - (Vector3::x() + Vector3::z())).magnitude() < EPSILON);

Panics

This method panics if bone index is out of bounds.

Sets relative position for bone with specified id. Affects global position of all descendant bones.

This method ignores current relative position of the bone. To apply translation to current relative poistion see Skelly::append_translation.

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let bone = skelly.attach(Vector3::x(), root);

let mut globals = [Isometry3::identity(); 2];
skelly.write_globals(&Isometry3::identity(), &mut globals);
let bone_global_old = globals[bone];

// Ensure that bone is placed correctly in global space at (1, 0, 0).
assert!((bone_global_old.translation.vector - Vector3::x()).magnitude() < EPSILON);

// Set new relative position for the `bone`.
skelly.set_position(bone, Vector3::z());

skelly.write_globals(&Isometry3::identity(), &mut globals);
let bone_global_new = globals[bone];

// Ensure that bone is placed correctly in global space at new position (0, 0, 1).
assert!((bone_global_new.translation.vector - Vector3::z()).magnitude() < EPSILON);

Panics

This method panics if bone index is out of bounds.

Returns current bone position relative to parent.

Sets relative orientation for bone with specified id. Affects global position of all descendant bones.

This method ignores current relative position of the bone. To apply translation to current relative poistion see Skelly::append_translation.

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let bone = skelly.attach(Vector3::x(), root);

let mut globals = [Isometry3::identity(); 2];
skelly.write_globals(&Isometry3::identity(), &mut globals);
let bone_global_old = globals[bone];

// Ensure that bone is placed correctly in global space at (1, 0, 0).
assert!((bone_global_old.translation.vector - Vector3::x()).magnitude() < EPSILON);

// Set new relative orientation for the `bone`.
skelly.set_orientation(root, UnitQuaternion::from_euler_angles(0.0, 0.0, PI / 2.0));

skelly.write_globals(&Isometry3::identity(), &mut globals);
let bone_global_new = globals[bone];

// Ensure that bone is placed correctly in global space at new position (0, 0, 1).
assert!((bone_global_new.translation.vector - Vector3::y()).magnitude() < EPSILON);

Panics

This method panics if bone index is out of bounds.

Returns current bone orientation relative to parent.

Returns current bone isometry relative to parent.

Returns reference to userdata associated with the bone.

Panics

This method panics if bone index is out of bounds.

Example

let mut skelly = Skelly::<f32, &str>::new();
let root = skelly.add_root_with(Point3::origin(), "root-bone-data");
let bone = skelly.attach_with(Vector3::x(), root, "another-bone-data");

assert_eq!(*skelly.get_userdata(root), "root-bone-data");
assert_eq!(*skelly.get_userdata(bone), "another-bone-data");

Returns mutable reference to userdata associated with the bone.

Panics

This method panics if bone index is out of bounds.

Example

let mut skelly = Skelly::<f32, Vec<&str>>::new();
let root = skelly.add_root_with(Point3::origin(), vec![]);

skelly.get_userdata_mut(root).push("another-root-data-entry");
assert_eq!(*skelly.get_userdata(root), ["another-root-data-entry"]);

Associated new userdata with the bone.

Panics

This method panics if bone index is out of bounds.

Example

let mut skelly = Skelly::<f32, &str>::new();
let root = skelly.add_root_with(Point3::origin(), "initial-root-data");

skelly.set_userdata(root, "new-root-data");
assert_eq!(*skelly.get_userdata(root), "new-root-data");

Returns parent of the specified bone. Returns None for root bones.

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let bone = skelly.attach(Vector3::x(), root);

assert_eq!(skelly.get_parent(bone), Some(root));

Panics

This method panics if bone index is out of bounds.

Returns number of bones in the skelly.

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let bone = skelly.attach(Vector3::x(), root);

assert_eq!(skelly.len(), 2);

Fills slice of Isometry3 with global isometries for each bone of the skelly.

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let bone = skelly.attach(Vector3::x(), root);

let mut globals = [Isometry3::identity(); 2];
skelly.write_globals(&Isometry3::identity(), &mut globals);

Makes the skelly to assume specifed posture.

Iterates through bone ancestors up until root bone is reached yielding their ids.

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let bone = skelly.attach(Vector3::x(), root);
let tip = skelly.attach(Vector3::x(), bone);

assert_eq!(skelly.iter_chain(tip).collect::<Vec<_>>(), [bone, root]);

Panics

This method panics if bone index is out of bounds.

Iterates through the bone’s direct descendants yielding their ids.

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let left = skelly.attach(Vector3::x(), root);
let right = skelly.attach(Vector3::x(), root);

assert_eq!(skelly.iter_children(root).collect::<Vec<_>>(), [left, right]);

This method is not very efficient. As it effectively scans sub-slice [bone..] Use with caution for too complex skellies in hot-paths.

TODO: Consider adding skelly building phase to pack siblings together.

Panics

This method panics if bone index is out of bounds.

Creates new root bone in the skelly at specified position.

Root bones are ones that have no parent bone.
Returns id of the added root bone.

skelly.add_root(pos) is a more pleasant shorthand for skelly.add_root_with(pos, ());

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());

Attaches new bone to an existing bone with specified id.

Returns id of the added bone.
The bone will be placed relative to its parent.

skelly.attach(relative, parent) is a more pleasant shorthand for skelly.attach_with(relative, parent, ());

Example

let mut skelly = Skelly::<f32>::new();
let root = skelly.add_root(Point3::origin());
let bone = skelly.attach(Vector3::x(), root);

Panics

This method panics if parent index is out of bounds.

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Performs the conversion.

Should always be Self

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more

Checks if self is actually part of its subset T (and can be converted to it).

Use with care! Same as self.to_subset but without any property checks. Always succeeds.

The inclusion map: converts self to the equivalent element of its superset.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.