private float CalculateEffort(ulong id, Efforts effort)
    {
        List <JointType> joints = effortJoints[effort];
        Dictionary <JointType, Transform> JointTransforms = BodyJoints[id];
        Dictionary <JointType, Vector3>   velocity        = BodyJoints_Velocity[id];
        Dictionary <JointType, Vector3>   acceleration    = BodyJoints_Acceleration[id];
        Dictionary <JointType, Vector3>   jerk            = BodyJoints_Jerk[id];

        //Dictionary<JointType, Vector3> JointPrevPos = BodyJoints_PrevPos[id];

        float weight = 0;

        switch (effort)
        {
        case Efforts.Weight:
            foreach (JointType joint in joints)
            {
                weight += velocity[joint].sqrMagnitude;
                weight /= joints.Count;
            }
            break;

        case Efforts.Space:
            // TODO: Try a different root joint, try different coroutine intervals
            // Inner product of root velocity and the normal vector of the trangle formed by the head and both shoulders.
            faceLeft   = JointTransforms[JointType.Head].position - JointTransforms[JointType.ShoulderLeft].position;
            faceRight  = JointTransforms[JointType.Head].position - JointTransforms[JointType.ShoulderRight].position;
            faceNormal = Vector3.Cross(faceRight, faceLeft);

            root = velocity[JointType.SpineBase];

            weight = Mathf.Abs(Vector3.Dot(faceNormal, root));
            break;

        case Efforts.Time:
            foreach (JointType joint in joints)
            {
                weight += Mathf.Sqrt(acceleration[joint].sqrMagnitude);
                weight /= joints.Count;
            }
            break;

        case Efforts.Flow:
            foreach (JointType joint in joints)
            {
                weight += Mathf.Sqrt(jerk[joint].sqrMagnitude);
                weight /= joints.Count;
            }
            break;

        default:
            break;
        }
        return(weight);
    }
Exemple #2
0
        public override string ToString()
        {
            var builder = new StringBuilder();

            builder.AppendFormat("\nsegment: [{0}]\n", Segment != null ? Segment.ToString() : string.Empty);
            builder.Append("efforts: [");

            if (Efforts != null)
            {
                Efforts.Each(effort => builder.AppendFormat("effort: [{0}]", effort));
            }

            builder.Append("]\n");

            return(builder.ToString());
        }
Exemple #3
0
            public RideEffortsV2 ToRideEfforts()
            {
                var rideEffort = new RideEffortsV2
                {
                    RideId  = ConvertWrapper.ToInt32(Id),
                    Version = Version,
                    Efforts = new List <EffortSegmentV2>()
                };

                if (Efforts != null)
                {
                    Efforts.Each(effort => rideEffort.Efforts.Add(effort.ToEffortSegment()));
                }

                return(rideEffort);
            }
Exemple #4
0
        public override string ToString()
        {
            var builder = new StringBuilder();

            builder.AppendFormat("\nRideId: {0}\n", RideId);
            builder.Append("EffortSegments: [");
            if (Efforts != null)
            {
                Efforts.Each((coord, index) =>
                {
                    builder.Append(coord);
                    if (index < (Efforts.Count - 1))
                    {
                        builder.Append(", ");
                    }
                });
            }
            builder.Append("]\n");
            builder.AppendFormat("Version: {0}\n", Version ?? string.Empty);

            return(builder.ToString());
        }
    IEnumerator CalculateFinalEffort(ulong id, List <float> list, float seconds, Efforts effort)
    {
        effortCalculationsRunning[effort] = true;
        yield return(new WaitForSeconds(seconds));

        float[] array;
        effortCalculationsRunning[effort] = false;

        switch (effort)
        {
        case Efforts.Weight:
            array = list.ToArray();
            float max = Mathf.Max(array);
            list.Clear();
            BodyWeightEffort[id] = max;
            WeightEffort         = BodyWeightEffort[id];
            break;

        case Efforts.Space:
            // TODO: fix me???
            array = list.ToArray();
            float cumSum = 0;
            for (int i = 0; i < array.Length; i++)
            {
                cumSum += array[i];
            }
            cumSum /= array.Length;
            list.Clear();
            yield return(BodySpaceEffort[id] = cumSum);

            break;

        case Efforts.Time:
            array = list.ToArray();
            float cumulativeSum = 0;
            for (int i = 0; i < array.Length; i++)
            {
                cumulativeSum += array[i];
            }
            cumulativeSum /= array.Length;
            list.Clear();
            BodyTimeEffort[id] = cumulativeSum;
            TimeEffort         = BodyTimeEffort[id];
            break;

        case Efforts.Flow:
            array = list.ToArray();
            float sum = 0;
            for (int i = 0; i < array.Length; i++)
            {
                sum += array[i];
            }
            sum /= array.Length;
            list.Clear();
            BodyFlowEffort[id] = sum;
            FlowEffort         = BodyFlowEffort[id];
            break;

        default:
            break;
        }
    }