コード例 #1
0
 private void Awake()
 {
     _renderer   = GetComponent <SpriteRenderer>();
     _jRigidbody = GetComponent <JRigidbody>();
     _jRigidbody.onCollisionEnter += CollisionEnter;
     _jRigidbody.onCollisionExit  += CollisionExit;
 }
コード例 #2
0
 private bool GetBodyCollisions(JRigidbody bodyA, JRigidbody bodyB, ref List <JCollision> collisions)
 {
     if (CheckIfBoundsCollide(bodyA.GetBounds(), bodyB.GetBounds()))
     {
         return(GetBodyCollisionsWithColliders(bodyA, bodyB, ref collisions));
     }
     return(false);
 }
コード例 #3
0
 private bool GetBodyCollisionsWithColliders(JRigidbody bodyA, JRigidbody bodyB, ref List <JCollision> collisions)
 {
     JCollider[] collidersA = bodyA.GetColliders();
     JCollider[] collidersB = bodyB.GetColliders();
     for (int i = 0; i < collidersA.Length; i++)
     {
         for (int j = 0; j < collidersB.Length; j++)
         {
             JCollision collision;
             if (JCollisionSolver.SolveCollision(collidersA[i], collidersB[j], out collision))
             {
                 collisions.Add(collision);
             }
         }
     }
     return(false);
 }
コード例 #4
0
    private void CorrectPositions(JCollision collision)
    {
        const float slop    = 0.01f;
        const float percent = 0.6f;

        JRigidbody bodyA = collision.colliderA.owningBody;
        JRigidbody bodyB = collision.colliderB.owningBody;

        Vector3 correction = (Mathf.Max(collision.collisionDepth - slop, 0.0f) / (bodyA.Mass + bodyB.Mass)) * percent * collision.collisionNormal;

        if (!bodyA._isKinematic)
        {
            bodyA.transform.position -= bodyA.Mass * correction;
        }
        if (!bodyB._isKinematic)
        {
            bodyB.transform.position += bodyB.Mass * correction;
        }
        //bodyA.ApplyForce(bodyA.Mass * correction * 200);
        //bodyB.ApplyForce(-bodyB.Mass * correction * 200);
    }
コード例 #5
0
 public static void DeregisterBody(JRigidbody body)
 {
     _bodies.Remove(body);
 }
コード例 #6
0
 public static void RegisterBody(JRigidbody body)
 {
     _bodies.Add(body);
     Debug.Log("Registered " + body.name);
 }
コード例 #7
0
    private void SolveFrameCollisions()
    {
        for (int i = 0; i < _frameCollisions.Count; i++)
        {
            JCollision collision = _frameCollisions[i];
            JRigidbody bodyA     = collision.colliderA.owningBody;
            JRigidbody bodyB     = collision.colliderB.owningBody;
            if (bodyA == null || bodyB == null)
            {
                continue;
            }

            Vector3   normal     = collision.collisionNormal.normalized;
            Vector3   velocityA  = bodyA.Velocity;
            Vector3   velocityB  = bodyB.Velocity;
            Matrix4x4 invTensorA = bodyA._colliders[0].GetInverseTensor(bodyA.Mass);
            Matrix4x4 invTensorB = bodyB._colliders[0].GetInverseTensor(bodyB.Mass);

            Debug.DrawLine(bodyA.transform.position, collision.collisionPoints[0], Color.red);

            for (int c = 0; c < collision.collisionPoints.Count; c++)
            {
                Vector3 relativeContactPointA = collision.collisionPoints[c] - bodyA.transform.position;
                Vector3 relativeContactPointB = collision.collisionPoints[c] - bodyB.transform.position;

                Vector3 contactVelocity =
                    ((velocityB + Vector3.Cross(bodyB.AngularVelocity, relativeContactPointB)) -
                     (velocityA + Vector3.Cross(bodyA.AngularVelocity, relativeContactPointA)));
                float reactionForceMagnitude = Vector3.Dot(contactVelocity, normal);

                if (reactionForceMagnitude > 0)
                {
                    continue;
                }

                float numerator = (-(1.0f + epsilon) * reactionForceMagnitude);

                float   d1          = (bodyA.GetInvMass() + bodyB.GetInvMass());
                Vector3 d2          = Vector3.Cross(invTensorA * Vector3.Cross(relativeContactPointA, normal), relativeContactPointA);
                Vector3 d3          = Vector3.Cross(invTensorB * Vector3.Cross(relativeContactPointB, normal), relativeContactPointB);
                float   denominator = d1 + Vector3.Dot(normal, d2 + d3);

                float j = (denominator == 0) ? 0 : (numerator / denominator);
                j /= (float)collision.collisionPoints.Count;

                Vector3 impulseReactionForce = (j * normal);

                bodyA.SetVelocity(velocityA - impulseReactionForce * bodyA.GetInvMass());
                bodyB.SetVelocity(velocityB + impulseReactionForce * bodyB.GetInvMass());

                bodyA.AngularVelocity = bodyA.AngularVelocity - (Vector3)(invTensorA * Vector3.Cross(relativeContactPointA, impulseReactionForce));
                bodyB.AngularVelocity = bodyB.AngularVelocity + (Vector3)(invTensorB * Vector3.Cross(relativeContactPointB, impulseReactionForce));



                //Vector3 tangent = (contactVelocity - (Vector3.Dot(contactVelocity, normal) * normal)).normalized;
                //float staticFrictionAverage = PythSolver(bodyA.StaticFriction, bodyB.StaticFriction);
                //float dynamicFrictionAverage = PythSolver(bodyA.DynamicFriction, bodyB.DynamicFriction);

                //numerator = -Vector3.Dot(contactVelocity, tangent);

                //d1 = (bodyA.GetInvMass() + bodyB.GetInvMass());
                //d2 = Vector3.Cross(invTensorA * Vector3.Cross(relativeContactPointA, tangent), relativeContactPointA);
                //d3 = Vector3.Cross(invTensorB * Vector3.Cross(relativeContactPointB, tangent), relativeContactPointB);
                //denominator = d1 + Vector3.Dot(tangent, d2 + d3);

                //if (denominator == 0)
                //{
                //    continue;
                //}



                //float jt = (numerator / denominator) / (float)collision.collisionPoints.Count;

                //if (jt <= 0)
                //{
                //    continue;
                //}

                //Debug.Log("test");


                //if (jt > j * dynamicFrictionAverage)
                //{
                //    jt = j * dynamicFrictionAverage;
                //}
                //else if (jt < -j * dynamicFrictionAverage)
                //{
                //    jt = -j * dynamicFrictionAverage;
                //}

                //Vector3 tangentImpulse = tangent * jt;

                //bodyA.SetVelocity(bodyA.Velocity - (tangentImpulse * bodyA.GetInvMass()));
                //bodyB.SetVelocity(bodyB.Velocity + (tangentImpulse * bodyB.GetInvMass()));

                //bodyA.AngularVelocity = bodyA.AngularVelocity - (Vector3)(invTensorA * Vector3.Cross(relativeContactPointA, impulseReactionForce));
                //bodyB.AngularVelocity = bodyB.AngularVelocity + (Vector3)(invTensorB * Vector3.Cross(relativeContactPointB, impulseReactionForce));
            }

            if (Mathf.Abs(bodyA.Velocity.magnitude) < 0.1f)
            {
                bodyA.SetVelocity(Vector3.zero);
            }

            if (Mathf.Abs(bodyB.Velocity.magnitude) < 0.1f)
            {
                bodyB.SetVelocity(Vector3.zero);
            }

            if (Mathf.Abs(bodyA.AngularVelocity.magnitude) < 0.1f)
            {
                bodyA.AngularVelocity = (Vector3.zero);
            }

            if (Mathf.Abs(bodyB.AngularVelocity.magnitude) < 0.1f)
            {
                bodyB.AngularVelocity = (Vector3.zero);
            }
        }
    }
コード例 #8
0
 private void Start()
 {
     body = GetComponent <JRigidbody>();
 }