16namespace OpenSim {
class Model; }
27 setDescription(
"Scales the masses of bodies in the model to match the subject mass, while preserving the overall mass disribution of each body in the model.");
34 const OpenSim::Model&
model)
const final
36 std::vector<ScalingStepValidationMessage> messages;
38 if (parameters.lookup<
double>(
"subject_mass").value_or(0.0) <= 0.0) {
39 std::stringstream msg;
40 msg <<
"The subject_mass scaling parameter must be greater than zero";
44 if (
model.getTotalMass(
model.getWorkingState()) <= 0.0) {
45 std::stringstream msg;
46 msg <<
"Cannot scale the model's mass to the subject's mass because the model itself has a mass of zero";
62 const OpenSim::Model&,
63 OpenSim::Model& resultModel)
const final
65 const auto subjectMass = parameters.lookup<
double>(
"subject_mass").value_or(0.0);
68 const std::optional<double> blendingFactor = parameters.lookup<
double>(
"blending_factor");
69 OSC_ASSERT_ALWAYS(blendingFactor &&
"blending_factor was not set by the warping engine");
71 const auto effectiveTargetMass =
osc::lerp(
72 resultModel.getTotalMass(resultModel.getWorkingState()),
#define OSC_ASSERT_ALWAYS(expr)
Definition assertions.h:20
Definition model_mass_to_subject_mass_scaling_step.h:21
void implForEachScalingParameterDeclaration(const std::function< void(const ScalingParameterDeclaration &)> &callback) const final
Definition model_mass_to_subject_mass_scaling_step.h:53
void implApplyScalingStep(ScalingCache &, const ScalingParameters ¶meters, const OpenSim::Model &, OpenSim::Model &resultModel) const final
Definition model_mass_to_subject_mass_scaling_step.h:59
std::vector< ScalingStepValidationMessage > implValidate(ScalingCache &, const ScalingParameters ¶meters, const OpenSim::Model &model) const final
Definition model_mass_to_subject_mass_scaling_step.h:31
Definition scaling_cache.h:30
Definition scaling_parameter_declaration.h:16
Definition scaling_parameters.h:14
Definition scaling_step.h:25
Definition static_component_registries.h:3
Definition component_registry.h:14
void InitializeModel(OpenSim::Model &)
void ScaleModelMassPreserveMassDistribution(OpenSim::Model &model, const SimTK::State &state, double newMass)
SimTK::State & InitializeState(OpenSim::Model &)
constexpr auto lerp(const Rgba< T > &x, const Rgba< T > &y, TInterpolant t)
Definition rgba.h:230