Ejemplo n.º 1
0
        internal void Update(PContact[] contacts, int num)
        {
            PContact[] old            = cs;
            int        oldNumContacts = numContacts;

            fric        = (float)System.Math.Sqrt(s1._fric * s2._fric);
            rest        = (float)System.Math.Sqrt(s1._rest * s2._rest);
            cs          = contacts;
            numContacts = num;
            for (int i = 0; i < numContacts; i++)
            {
                PContact c = cs[i];
                c.rel1  = c.pos.Sub(b1.pos);
                c.rel2  = c.pos.Sub(b2.pos);
                c.massN = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
                                                         c.normal);
                c.massT = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
                                                         c.tangent);
                c.tangent.Set(c.normal.y, -c.normal.x);
                c.localRel1.Set(c.rel1.x, c.rel1.y);
                c.localRel2.Set(c.rel2.x, c.rel2.y);
                b1.mAng.Transpose().MulEqual(c.localRel1);
                b2.mAng.Transpose().MulEqual(c.localRel2);
            }

            for (int i_0 = 0; i_0 < oldNumContacts; i_0++)
            {
                for (int j = 0; j < numContacts; j++)
                {
                    if (old[i_0].data.id == cs[j].data.id &&
                        old[i_0].data.flip == cs[j].data.flip)
                    {
                        cs[j].norI = old[i_0].norI;
                        cs[j].tanI = old[i_0].tanI;
                    }
                }
            }

            rem = false;
        }
Ejemplo n.º 2
0
 public PSolver(PShape shape1, PShape shape2, PContact[] contacts, int num)
 {
     s1          = shape1;
     s2          = shape2;
     b1          = s1._parent;
     b2          = s2._parent;
     fric        = (float)System.Math.Sqrt(s1._fric * s2._fric);
     rest        = (float)System.Math.Sqrt(s1._rest * s2._rest);
     cs          = contacts;
     numContacts = num;
     for (int i = 0; i < numContacts; i++)
     {
         PContact c = cs[i];
         c.rel1  = c.pos.Sub(b1.pos);
         c.rel2  = c.pos.Sub(b2.pos);
         c.massN = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
                                                  c.normal);
         c.massT = PTransformer.CalcEffectiveMass(b1, b2, c.rel1, c.rel2,
                                                  c.tangent);
         c.relVel = PTransformer
                    .CalcRelativeVelocity(b1, b2, c.rel1, c.rel2);
         float rvn = c.relVel.Dot(c.normal);
         if (rvn < -0.5F)
         {
             c.targetVelocity = System.Math.Max(rest * -rvn, 0.0F);
         }
         else
         {
             c.targetVelocity = 0.0F;
         }
         c.tangent.Set(c.normal.y, -c.normal.x);
         c.localRel1.Set(c.rel1.x, c.rel1.y);
         c.localRel2.Set(c.rel2.x, c.rel2.y);
         b1.mAng.Transpose().MulEqual(c.localRel1);
         b2.mAng.Transpose().MulEqual(c.localRel2);
     }
 }