The current llGetBoundingBox function returns the bounding box with the root objects axes being used to define it. A globally based one in region co-ordinates could be useful. I've just had to put a function together to achieve this to find suitable co-ordinates for a llTriggerSoundLimited call. list GetGlobalBoundingBoxFromKey(key targetKey) { list info = llGetObjectDetails(targetKey, [OBJECT_POS, OBJECT_ROT]); list bbox = llGetBoundingBox(targetKey); if (llGetListLength(info) != 2 || llGetListLength(bbox) != 2) { // Invalid input return []; } vector rootPos = llList2Vector(info, 0); rotation rootRot = llList2Rot(info, 1); vector localMin = llList2Vector(bbox, 0); vector localMax = llList2Vector(bbox, 1); list corners = [ <localMin.x, localMin.y, localMin.z>, <localMin.x, localMin.y, localMax.z>, <localMin.x, localMax.y, localMin.z>, <localMin.x, localMax.y, localMax.z>, <localMax.x, localMin.y, localMin.z>, <localMax.x, localMin.y, localMax.z>, <localMax.x, localMax.y, localMin.z>, <localMax.x, localMax.y, localMax.z> ]; vector globalMin = <255.0, 255.0, 4096.0>; vector globalMax = <0.0, 0.0, 0.0>; integer i; for (i = 0; i < 8; ++i) { vector localCorner = llList2Vector(corners, i); vector worldCorner = localCorner * rootRot + rootPos; if (worldCorner.x < globalMin.x) globalMin.x = worldCorner.x; if (worldCorner.y < globalMin.y) globalMin.y = worldCorner.y; if (worldCorner.z < globalMin.z) globalMin.z = worldCorner.z; if (worldCorner.x > globalMax.x) globalMax.x = worldCorner.x; if (worldCorner.y > globalMax.y) globalMax.y = worldCorner.y; if (worldCorner.z > globalMax.z) globalMax.z = worldCorner.z; } return [globalMin, globalMax];