public static void SphereSphereCollision(CollisionManager.HullCollision col) { // *IMPORTANT* for circle and square the collision only wirks with obejct1 - object 2 and not viceversa, must be a prob in clollision resolution SphereHull hull1 = col.a.GetComponent <SphereHull>(); SphereHull hull2 = col.b.GetComponent <SphereHull>(); Vector3 range = (hull2.transform.position + hull2.localCenter) - (hull1.transform.position + hull1.localCenter); // make sure offsets arent screwing things up float overlap = (hull2.radius + hull1.radius) - range.magnitude; //HullCollision col = new CollisionManager.HullCollision(); //col.a = hull1; //col.b = hull2; col.penetration = range * overlap; CollisionManager.HullCollision.Contact con0 = new CollisionManager.HullCollision.Contact(); con0.point = (range.normalized * hull1.radius) + hull1.transform.position; con0.normal = range.normalized; con0.restitution = Mathf.Min(hull1.restitution, hull2.restitution); col.contacts[0] = con0; Particle3D c1 = hull1.GetComponentInParent <Particle3D>(); Particle3D c2 = hull2.GetComponentInParent <Particle3D>(); Vector3 closingVel = c2.velocity - c1.velocity; // started as c1 -c2 col.closingVelocity = closingVel; if (overlap >= 0) { col.status = true; //Debug.Log("touch"); } else { col.status = false; } }
public static void AABBAABBCollision(CollisionManager.HullCollision col) { Vector3 min0, max0, min1, max1; AABBHull A = col.a.GetComponent <AABBHull>(); AABBHull B = col.b.GetComponent <AABBHull>(); min0 = A.transform.position - A.halfSize + A.localCenter; max0 = A.transform.position + A.halfSize + A.localCenter; min1 = B.transform.position - B.halfSize + B.localCenter; max1 = B.transform.position + B.halfSize + B.localCenter; Vector3 range = (B.transform.position + B.localCenter) - (A.transform.position + A.localCenter); // make sure offsets arent screwing things up float xOverlap = A.halfSize.x + B.halfSize.x - Mathf.Abs(range.x); float yOverlap = A.halfSize.y + B.halfSize.y - Mathf.Abs(range.y); float zOverlap = A.halfSize.z + B.halfSize.z - Mathf.Abs(range.z); // was math.abs col.penetration = new Vector3(xOverlap, yOverlap); //Vector3 closingVel = A.velocity - B.velocity; Vector3 closingVel = B.GetComponent <Particle3D>().velocity - A.GetComponent <Particle3D>().velocity; col.closingVelocity = closingVel; CollisionManager.HullCollision.Contact con0 = new CollisionManager.HullCollision.Contact(); con0.point = new Vector3(Mathf.Clamp(range.x, -A.halfSize.x, A.halfSize.x), Mathf.Clamp(range.y, -A.halfSize.y, A.halfSize.y), Mathf.Clamp(range.z, -A.halfSize.z, A.halfSize.z)); con0.restitution = Mathf.Min(A.restitution, B.restitution); if (max0.x >= min1.x && max1.x >= min0.x) { if (max0.y >= min1.y && max1.y >= min0.y) { Vector3 collisionNormal = new Vector3(); if (con0.point.x == A.halfSize.x)//added mathf { collisionNormal = new Vector3(1.0f, 0.0f, 0.0f); } if (con0.point.x == -A.halfSize.x)//added mathf { collisionNormal = new Vector3(-1.0f, 0.0f, 0.0f); } if (con0.point.y == A.halfSize.y) { collisionNormal = new Vector3(0.0f, 1.0f, 0.0f); } if (con0.point.y == -A.halfSize.y) { collisionNormal = new Vector3(0.0f, -1.0f, 0.0f); } if (con0.point.z == A.halfSize.z) { collisionNormal = new Vector3(0.0f, 0.0f, 1.0f); } if (con0.point.z == -A.halfSize.z) { collisionNormal = new Vector3(0.0f, 0.0f, -1.0f); } con0.normal = collisionNormal; col.status = true; } } else { col.status = false; } col.contacts[0] = con0; }
public static void SphereAABBCollision(CollisionManager.HullCollision collision) { AABBHull boxHull; SphereHull sphere; if (collision.a.GetHullType() == hullType.AABB) { boxHull = collision.a.GetComponent <AABBHull>(); sphere = collision.b.GetComponent <SphereHull>(); } else { //Debug.Log("flipped"); boxHull = collision.b.GetComponent <AABBHull>(); sphere = collision.a.GetComponent <SphereHull>(); } Vector3 closestPoint; Vector3 range = (boxHull.transform.position + boxHull.localCenter) - (sphere.transform.position + sphere.localCenter); closestPoint = new Vector3(Mathf.Clamp(range.x, -boxHull.halfSize.x, boxHull.halfSize.x), Mathf.Clamp(range.y, -boxHull.halfSize.y, boxHull.halfSize.y), Mathf.Clamp(range.z, -boxHull.halfSize.z, boxHull.halfSize.z)); Vector3 closingVel = sphere.GetComponent <Particle3D>().velocity - boxHull.GetComponent <Particle3D>().velocity; // swapped Vector3 penetration = closestPoint - range; // swapped collision.closingVelocity = closingVel; collision.penetration = penetration; CollisionManager.HullCollision.Contact con0 = new CollisionManager.HullCollision.Contact(); con0.point = closestPoint; con0.restitution = Mathf.Min(boxHull.restitution, sphere.restitution); if (penetration.magnitude <= sphere.radius) { Vector3 collisionNormal = new Vector3(); if (closestPoint.x == boxHull.halfSize.x)//added mathf { collisionNormal.x = 1.0f; } if (closestPoint.x == -boxHull.halfSize.x)//added mathf { collisionNormal.x = -1.0f; } if (closestPoint.y == boxHull.halfSize.y) { collisionNormal.y = 1.0f; } if (closestPoint.y == -boxHull.halfSize.y) { collisionNormal.y = -1.0f; } if (closestPoint.z == boxHull.halfSize.z) { collisionNormal.z = 1.0f; } if (closestPoint.z == -boxHull.halfSize.z) { collisionNormal.z = -1.0f; } collisionNormal.Normalize(); con0.normal = -collisionNormal; //Debug.Log(con0.normal); collision.status = true; collision.contacts[0] = con0; } else { collision.status = false; } }