Don't use separating axis theorem for this. It's overkill for spheres. Instead: 1. Use the OBB's orientation & translation information to inverse-transform the sphere's center into the box's local space. `localSphereCenter = box.InverseTransformPoint(sphere.worldCenter)` 2. Find the closest point on the box to this point. Now that you're working on the box's local axes, this is as simple as a component-wise clamp on each axis: `closest.x = max(box.localMin.x, min(localSphereCenter.x, box.localMax.x));`<br/> `... likewise for y, z` 3. Transform that point back to worldspace (to account for scale in your OBB, if applicable), then take the offset vector from this closest point to the sphere center. If it's shorter than your radius, the sphere intersects the box. The minimum translation vector (if the center is not in the box) is then this offset vector scaled to the remaining length: translation = (sphere.radius - offset.length) * offset.normalized If the sphere center is inside the box, then this displacement vector will be zero. You can clamp the point to the nearest face of the box, then form a penetration vector equal to the sphere center minus this closest face point. Your minimum translation vector is then: translation = -1 * (sphere.radius + penetration.length) * penetration.normalized Since we've computed these separations/penetrations in the box's local space, remember to transform them back to world space at the end to use them for moving objects.