static public CollisionInfo CircleOBB(CircleCollision3D circle, ObjectBoundingBoxCollision3D rect) { //transform circle into obb space transform.InverseTransformPoint(cirecle.postion); //then do circle AABB Vector3 halfExtend = (rect.posMax - rect.posMin) / 2; Vector3 circleInOBB = rect.GetComponent <Particle3D>().GetWorldToObject().MultiplyPoint(circle.center);//rect.transform.InverseTransformPoint(circle.center); Vector3 circleBox = new Vector3( Mathf.Max(-halfExtend.x, Mathf.Min(circleInOBB.x, halfExtend.x)), Mathf.Max(-halfExtend.y, Mathf.Min(circleInOBB.y, halfExtend.y)), Mathf.Max(-halfExtend.z, Mathf.Min(circleInOBB.z, halfExtend.z))); Vector3 distanceVec = circleInOBB - circleBox; float distanceSQ = Vector3.Dot(distanceVec, distanceVec); //Debug.DrawLine(circleBox, circle.center); if (distanceSQ <= (circle.radius * circle.radius)) { //return true; //Debug.Log("circ obb collision"); float distance = Mathf.Sqrt(distanceSQ); return(new CollisionInfo(circle, rect, rect.transform.TransformVector(-distanceVec).normalized, circle.radius - distance)); } return(null); }
static public CollisionInfo CircleCircle(CircleCollision3D colA, CircleCollision3D colB) { //How the slides say to do it //Step1: Calculate distance from center to center, distance = colB.center - colA.center //Step2: Add the two radius together colB.radius + colA.radius //Step3: Do DotProduct(distance,distance)<radius together^2 Vector3 distance = colB.center - colA.center; float radialSum = colA.radius + colB.radius; if (Vector3.Dot(distance, distance) <= (radialSum * radialSum)) { /*double angle = System.Math.Atan2(colB.center.y - colA.center.y, colB.center.x - colA.center.x); * float circleDistance = (float)System.Math.Sqrt((colB.center.x - colA.center.x) * (colB.center.x - colA.center.x) + (colB.center.y - colA.center.y) * (colB.center.y - colA.center.y)); * float distToMove = radialSum - circleDistance; * colB.center.x += (float)(System.Math.Cos(angle) * circleDistance); * colB.center.y += (float)(System.Math.Cos(angle) * circleDistance);*/ float fDistance = Mathf.Sqrt(Vector3.Dot(distance, distance)); //Debug.Log("Circ - collision"); return(new CollisionInfo(colA, colB, distance / fDistance, radialSum - fDistance)); } else { return(null); } }
public CollisionInfo(CircleCollision3D colA, CircleCollision3D colB, Vector3 normal, float penetration) { RigidBodyA = colA.GetComponent <Particle3D>(); RigidBodyB = colB.GetComponent <Particle3D>(); RelativeVelocity = RigidBodyB.velocity - RigidBodyA.velocity; contacts[0].normal = normal; contacts[0].penetration = penetration; contacts[0].restitution = Mathf.Min(RigidBodyA.restitution, RigidBodyB.restitution); }
static public CollisionInfo CircleAABB(CircleCollision3D circle, AxisAllignedBoundingBoxCollision3D rect) { //Vector3 halfExtend = (rect.posMax - rect.posMin) / 2; // clamp(value, min, max) - limits value to the range min..max Vector3 circleBox = new Vector3( Mathf.Max(rect.posMin.x + rect.center.x, Mathf.Min(circle.center.x, rect.posMax.x + rect.center.x)), Mathf.Max(rect.posMin.y + rect.center.y, Mathf.Min(circle.center.y, rect.posMax.y + rect.center.y)), Mathf.Max(rect.posMin.z + rect.center.z, Mathf.Min(circle.center.z, rect.posMax.z + rect.center.z))); // Find the closest point to the circle within the rectangle float closestX = Mathf.Clamp(circle.center.x, -rect.halfExtends.x, rect.halfExtends.x); float closestY = Mathf.Clamp(circle.center.y, -rect.halfExtends.y, rect.halfExtends.y); float closestZ = Mathf.Clamp(circle.center.z, -rect.halfExtends.z, rect.halfExtends.z); Vector3 closestPoint = new Vector3(closestX, closestY, closestZ); // Calculate the distance between the circle's center and this closest point //float distanceX = circle.center.x - closestX; //float distanceY = circle.center.y - closestY; //float distanceZ = circle.center.z - closestZ; Vector3 disVec = circle.center - circleBox; //Vector3 distanceComplete = closestPoint - closestPoint; //possibly change to circle vox // If the distance is less than the circle's radius, an intersection occurs //float distSq = Vector3.Dot(distanceComplete, distanceComplete); float distSq = Vector3.Dot(disVec, disVec); //float distanceSquared = (distanceX * distanceX) + (distanceY * distanceY) + (distanceZ * distanceZ); float distance = Mathf.Sqrt(distSq); //Debug.DrawLine(closestPoint, circle.center); if (distSq <= (circle.radius * circle.radius)) { //Debug.Log("square circ collision)"); //return new CollisionInfo(circle, rect, -distanceComplete.normalized, circle.radius - distance); return(new CollisionInfo(circle, rect, -disVec.normalized, circle.radius - distance)); } return(null); //return distanceSquared < (circle.radius * circle.radius); }