use phyz_math::SpatialTransformExt;
use phyz_model::{Model, State};
pub fn kinetic_energy(model: &Model, state: &State) -> f64 {
let m = crate::crba(model, state);
0.5 * state.v.dot(&(&m * &state.v))
}
pub fn potential_energy(model: &Model, state: &State) -> f64 {
let (xforms, _) = crate::forward_kinematics(model, state);
let mut pe = 0.0;
for (i, body) in model.bodies.iter().enumerate() {
let mass = body.inertia.mass;
let com_local = body.inertia.com;
let xf = &xforms[i];
let com_world = xf.body_to_world_point(com_local);
pe -= mass * model.gravity.dot(com_world);
}
pe
}
pub fn total_energy(model: &Model, state: &State) -> f64 {
kinetic_energy(model, state) + potential_energy(model, state)
}