protected static CollisionInfo CircleVSAABB(CircleHull circle, AABBHull AABB) { Vector3 circleBox = new Vector3(Mathf.Max(AABB.min.x + AABB.center.x, Mathf.Min(circle.GetCenter().x, AABB.max.x + AABB.center.x)), Mathf.Max(AABB.min.y + AABB.center.y, Mathf.Min(circle.GetCenter().y, AABB.max.y + AABB.center.y)), Mathf.Max(AABB.min.z + AABB.center.z, Mathf.Min(circle.GetCenter().z, AABB.max.z + AABB.center.z))); Vector3 distanceVec = circle.GetCenter() - circleBox; float distanceSQ = Vector3.Dot(distanceVec, distanceVec); if (distanceSQ > (circle.radius * circle.radius)) { return null; } float distance = Mathf.Sqrt(distanceSQ); return new CollisionInfo(circle, AABB, -distanceVec.normalized, circle.radius - distance, circleBox); }
protected static CollisionInfo CircleVSCircle(CircleHull circle1, CircleHull circle2) { float radiusSum = circle1.radius + circle2.radius; float totalRadius = (circle1.radius + circle2.radius) * (circle1.radius + circle2.radius); Vector3 centerDiff = (circle2.GetCenter() - circle1.GetCenter()); float distanceSQ = Vector3.Dot(centerDiff, centerDiff); if (distanceSQ > totalRadius) { return null; } float distance = Mathf.Sqrt(distanceSQ); return new CollisionInfo(circle1, circle2, centerDiff / distance, radiusSum - distance,(circle1.GetCenter() + centerDiff * 0.5f)); }
static public bool CircleVSCircle(CircleHull circle1, CircleHull circle2) { float totalRadius = (circle1.radius + circle2.radius); //* (circle1.radius + circle2.radius); Vector2 distance = (circle2.GetCenter() - circle1.GetCenter()); if (Vector2.Dot(distance, distance) <= totalRadius) { return(true); } else { return(false); } }
static protected bool CircleVSAABB(CircleHull circle, AABBHull AABB) { Vector2 circleBox = new Vector2(Mathf.Max(AABB.min.x + AABB.center.x, Mathf.Min(circle.GetCenter().x, AABB.max.x + AABB.center.x)), Mathf.Max(AABB.min.y + AABB.center.y, Mathf.Min(circle.GetCenter().y, AABB.max.y + AABB.center.y))); Vector2 distance = circle.GetCenter() - circleBox; float distanceSQ = Vector2.Dot(distance, distance); if (distanceSQ <= (circle.radius * circle.radius)) { return(true); } return(false); }
static protected bool CircleVSOBB(CircleHull circle, OBBHull OBB) { Vector2 halfExtend = (OBB.max - OBB.min) / 2; Vector2 circleInOBB = OBB.transform.InverseTransformPoint(circle.GetCenter()); Vector2 circleBox = new Vector2(Mathf.Max(-halfExtend.x, Mathf.Min(circleInOBB.x, halfExtend.x)), Mathf.Max(-halfExtend.y, Mathf.Min(circleInOBB.y, halfExtend.y))); Vector2 distance = circleInOBB - circleBox; float distanceSQ = Vector2.Dot(distance, distance); if (distanceSQ <= (circle.radius * circle.radius)) { return(true); } return(false); }
static protected CollisionInfo CircleVSOBB(CircleHull circle, OBBHull OBB) { Vector2 halfExtend = (OBB.max - OBB.min) / 2; Vector2 circleInOBB = OBB.transform.InverseTransformPoint(circle.GetCenter()); Vector2 circleBox = new Vector2(Mathf.Max(-halfExtend.x, Mathf.Min(circleInOBB.x, halfExtend.x)), Mathf.Max(-halfExtend.y, Mathf.Min(circleInOBB.y, halfExtend.y))); Vector2 distanceVec = circleInOBB - circleBox; float distanceSQ = Vector2.Dot(distanceVec, distanceVec); if (distanceSQ > (circle.radius * circle.radius)) { return(null); } float distance = Mathf.Sqrt(distanceSQ); return(new CollisionInfo(circle, OBB, OBB.transform.TransformVector(-distanceVec).normalized, circle.radius - distance)); }
protected static CollisionInfo CircleVSOBB(CircleHull circle, OBBHull OBB) { Vector3 halfExtend = OBB.halfExtends; Vector3 circleInOBB = OBB.GetComponent<Particle3D>().getWorldToObject().MultiplyPoint(circle.GetCenter()); 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); if (distanceSQ > (circle.radius * circle.radius)) { return null; } Vector3 closestPt = new Vector3(0f,0f,0f); float dist; // Clamp each coordinate to the box. dist = circleInOBB.x; if (dist > OBB.halfExtends.x) dist = OBB.halfExtends.x; if (dist < -OBB.halfExtends.x) dist = -OBB.halfExtends.x; closestPt.x = dist; dist = circleInOBB.y; if (dist > OBB.halfExtends.y) dist = OBB.halfExtends.y; if (dist < -OBB.halfExtends.y) dist = -OBB.halfExtends.y; closestPt.y = dist; dist = circleInOBB.z; if (dist > OBB.halfExtends.z) dist = OBB.halfExtends.z; if (dist < -OBB.halfExtends.z) dist = -OBB.halfExtends.z; closestPt.z = dist; // Check to see if we’re in contact. dist = (closestPt - circleInOBB).sqrMagnitude; if (dist > circle.radius * circle.radius) return null; // Compile the contact. Vector3 closestPtWorld = OBB.GetComponent<Particle3D>().getObjectToWorld().MultiplyPoint(closestPt); //place contact point in world space float distance = Mathf.Sqrt(distanceSQ); //Debug.LogError(closestPtWorld); return new CollisionInfo(circle, OBB, (-distanceVec).normalized, (circle.radius - distance),closestPtWorld); //OBB.GetComponent<Particle3D>().getObjectToWorld().MultiplyPoint(-distanceVec).normalized this failed to work, removing it fixed it }
static protected CollisionInfo CircleVSOBB(CircleHull circle, OBBHull OBB) { Vector3 halfExtend = OBB.halfExtends; Vector3 circleInOBB = OBB.GetComponent <Particle3D>().getWorldToObject().MultiplyPoint(circle.GetCenter()); 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); if (distanceSQ > (circle.radius * circle.radius)) { return(null); } //place contact point in world space float distance = Mathf.Sqrt(distanceSQ); return(new CollisionInfo(circle, OBB, (-distanceVec).normalized, (circle.radius - distance))); //OBB.GetComponent<Particle3D>().getObjectToWorld().MultiplyPoint(-distanceVec).normalized this failed to work, removing it fixed it }