47 lines
1.7 KiB
C#
47 lines
1.7 KiB
C#
using UnityEngine;
|
|
|
|
//!!!!!!
|
|
//This objective type is still under development
|
|
//!!!!!!
|
|
|
|
namespace BioIK {
|
|
|
|
//This objective aims to minimise the joint configuration changes between consecutive solutions.
|
|
//It should only be used once as it acts as a global objective for the whole body posture.
|
|
//Preferably add it to the root of your character.
|
|
[AddComponentMenu("")]
|
|
public class Displacement : BioObjective {
|
|
|
|
public override ObjectiveType GetObjectiveType() {
|
|
return ObjectiveType.Displacement;
|
|
}
|
|
|
|
public override void UpdateData() {
|
|
|
|
}
|
|
|
|
public override double ComputeLoss(double WPX, double WPY, double WPZ, double WRX, double WRY, double WRZ, double WRW, Model.Node node, double[] configuration) {
|
|
double loss = 0.0;
|
|
for(int i=0; i<configuration.Length; i++) {
|
|
double diff = System.Math.Abs(Segment.Character.Evolution.GetSolution()[i] - configuration[i]) / (Segment.Character.Evolution.GetUpperBounds()[i] - Segment.Character.Evolution.GetLowerBounds()[i]);
|
|
loss += diff;
|
|
}
|
|
loss /= configuration.Length;
|
|
return Weight * loss * loss;
|
|
}
|
|
|
|
public override bool CheckConvergence(double WPX, double WPY, double WPZ, double WRX, double WRY, double WRZ, double WRW, Model.Node node, double[] configuration) {
|
|
return true;
|
|
}
|
|
|
|
public override double ComputeValue(double WPX, double WPY, double WPZ, double WRX, double WRY, double WRZ, double WRW, Model.Node node, double[] configuration) {
|
|
double value = 0.0;
|
|
for(int i=0; i<configuration.Length; i++) {
|
|
double diff = System.Math.Abs(Segment.Character.Evolution.GetSolution()[i] - configuration[i]) / (Segment.Character.Evolution.GetUpperBounds()[i] - Segment.Character.Evolution.GetLowerBounds()[i]);
|
|
value += diff;
|
|
}
|
|
return value /= configuration.Length;
|
|
}
|
|
}
|
|
|
|
} |