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; } }