private void ApplyTearing()
        {
            ObiDistanceConstraintBatch distanceBatch = DistanceConstraints.GetFirstBatch();

            float[] forces = new float[distanceBatch.ConstraintCount];
            Oni.GetBatchConstraintForces(distanceBatch.OniBatch, forces, distanceBatch.ConstraintCount, 0);

            List <TornEdge> tornEdges = new List <TornEdge>();

            for (int i = 0; i < forces.Length; i++)
            {
                float p1Resistance = tearResistance[distanceBatch.springIndices[i * 2]];
                float p2Resistance = tearResistance[distanceBatch.springIndices[i * 2 + 1]];

                // average particle resistances:
                float resistance = (p1Resistance + p2Resistance) * 0.5f * tearResistanceMultiplier;

                if (-forces[i] * 1000 > resistance)          // units are kilonewtons.
                {
                    tornEdges.Add(new TornEdge(i, forces[i]));
                }
            }

            if (tornEdges.Count > 0)
            {
                // sort edges by tear force:
                tornEdges.Sort(delegate(TornEdge x, TornEdge y) {
                    return(x.force.CompareTo(y.force));
                });

                DistanceConstraints.RemoveFromSolver(null);
                for (int i = 0; i < Mathf.Min(tearRate, tornEdges.Count); i++)
                {
                    Tear(tornEdges[i].index);
                }
                DistanceConstraints.AddToSolver(this);

                // update active bending constraints:
                BendingConstraints.SetActiveConstraints();

                // update solver deformable triangle indices:
                UpdateDeformableTriangles();

                // upload active particle list to solver:
                solver.UpdateActiveParticles();
            }
        }
Beispiel #2
0
        protected void ApplyTearing()
        {
            if (!tearable)
            {
                return;
            }

            ObiDistanceConstraintBatch distanceBatch = DistanceConstraints.GetFirstBatch();

            float[] forces = new float[distanceBatch.ConstraintCount];
            Oni.GetBatchConstraintForces(distanceBatch.OniBatch, forces, distanceBatch.ConstraintCount, 0);

            List <int> tearedEdges = new List <int>();

            for (int i = 0; i < forces.Length; i++)
            {
                float p1Resistance = tearResistance[distanceBatch.springIndices[i * 2]];
                float p2Resistance = tearResistance[distanceBatch.springIndices[i * 2 + 1]];

                // average particle resistances:
                float resistance = (p1Resistance + p2Resistance) * 0.5f * tearResistanceMultiplier;

                if (-forces[i] * 1000 > resistance)                  // units are kilonewtons.
                {
                    tearedEdges.Add(i);
                }
            }

            if (tearedEdges.Count > 0)
            {
                DistanceConstraints.RemoveFromSolver(null);
                BendingConstraints.RemoveFromSolver(null);
                for (int i = 0; i < tearedEdges.Count; i++)
                {
                    Tear(tearedEdges[i]);
                }
                BendingConstraints.AddToSolver(this);
                DistanceConstraints.AddToSolver(this);

                // update active bending constraints:
                BendingConstraints.SetActiveConstraints();

                // upload active particle list to solver:
                solver.UpdateActiveParticles();
            }
        }