Esempio n. 1
0
    private void CalculateAccelerations()
    {
        //calculamos la fuerza de cada muelle y las guardamos en una lista para luego adjudicarla a los segmentos
        List <Vector3Class> springForces = new List <Vector3Class>();

        for (int i = 0; i < ropeSegments.Count - 1; i++)
        {
            Vector3Class p1p2 = ropeSegments[i + 1].pos - ropeSegments[i].pos;

            //elasticity part
            float part1 = kElasticity * (p1p2.Size() - stringPartLength);

            //Damping part
            float part2 = kDamping * ((p1p2.DotProduct(ropeSegments[i + 1].speed - ropeSegments[i].speed, p1p2.Normalize(p1p2))));

            //calculamos total del muelle juntando las 2 partes
            Vector3Class resultForce = p1p2.Normalize(p1p2);
            resultForce *= (part1 + part2) * -1;

            //al estar el orden de pos2 a pos1, este force es el negativo (f2)
            resultForce *= -1;

            springForces.Add(resultForce);
        }

        for (int i = 0; i < ropeSegments.Count - 1; i++)
        {
            Vector3Class springForce = new Vector3Class();
            //spring que corresponde a F1 de la formula
            if (i != 0)
            {
                springForce -= springForces[i - 1];
            }

            //spring que corresponde a F2 de la formula
            springForce += springForces[i];

            //masa del segmento de la cuerda, hacemos variable a parte para añadir el peso de la bola al ultimo
            float springMass = massRopeSegment;
            //segmento con la bola
            if (i == 0)
            {
                springMass = massLastRopeSegment;
            }

            //creamos fuerza de gravedad con la masa
            Vector3Class gravityForce = new Vector3Class(0f, gravity, 0f);
            gravityForce *= springMass;

            //sumamos ambas fuerzas calculadas
            Vector3Class totalForce = springForce + gravityForce;
            //finalmente, calculamos la aceleracion resultante de la fuerza
            Vector3Class acceleration = totalForce / springMass;
            CilinderBody temp         = ropeSegments[i];
            temp.acc        = acceleration;
            ropeSegments[i] = temp;
        }
    }