Notifications
Clear all

[Closed] How to get the bounding box' size?

Hi,
I’m looking for a method to get the positions of the 8 corners of an object’s bounding box. The $.min and $.max only return the coordinates for two of them. How can I get the positions of the other 6 corners?
Thanks,
Christian

6 Replies

That’s easy. You have all you need with the object min and max coordinates:

fn getBBoxPoints obj = (
	local bbPoints = #()

	local bbMax = obj.max
	local bbMin = obj.min

	append bbPoints (Point3 bbMax.x bbMax.y bbMax.z)	-- top-right-front corner
	append bbPoints (Point3 bbMax.x bbMin.y bbMax.z)	-- top-right-back corner
	append bbPoints (Point3 bbMin.x bbMin.y bbMax.z)	-- top-left-back corner
	append bbPoints (Point3 bbMin.x bbMax.y bbMax.z)	-- top-left-front corner
	
	append bbPoints (Point3 bbMax.x bbMax.y bbMin.z)	-- bottom-right-front corner
	append bbPoints (Point3 bbMax.x bbMin.y bbMin.z)	-- bottom-right-back corner
	append bbPoints (Point3 bbMin.x bbMin.y bbMin.z)	-- bottom-left-back corner
	append bbPoints (Point3 bbMin.x bbMax.y bbMin.z)	-- bottom-left-front corner
	
	return bbPoints
)

Greets.

Thank you for your posting. Your function works fine for objects with bounding boxes that are aligned to the axes of the current coordinate system. The problem is that somehow I have to consider the orientation of the bounding box…

1 Reply
(@halfvector)
Joined: 11 months ago

Posts: 0

Ok, so what you want is the oriented bounding box of the object.

Here’s a simple way to do this. I don’t know if it works the 100% of the cases but…

-- Calculates the axis-aligned bounding box corners of an object
fn getAABBoxPoints obj = (
	local aabbPoints = #()

	-- Get minimum and maximum bounding box coordinates
	local bbMax = obj.max
	local bbMin = obj.min

	-- Build the axis-aligned bounding box corners

	append aabbPoints (Point3 bbMax.x bbMax.y bbMax.z)	-- top-right-front corner
	append aabbPoints (Point3 bbMax.x bbMin.y bbMax.z)	-- top-right-back corner
	append aabbPoints (Point3 bbMin.x bbMin.y bbMax.z)	-- top-left-back corner
	append aabbPoints (Point3 bbMin.x bbMax.y bbMax.z)	-- top-left-front corner
	
	append aabbPoints (Point3 bbMax.x bbMax.y bbMin.z)	-- bottom-right-front corner
	append aabbPoints (Point3 bbMax.x bbMin.y bbMin.z)	-- bottom-right-back corner
	append aabbPoints (Point3 bbMin.x bbMin.y bbMin.z)	-- bottom-left-back corner
	append aabbPoints (Point3 bbMin.x bbMax.y bbMin.z)	-- bottom-left-front corner
	
	return aabbPoints
)

-- Calculates the oriented bounding box corners of an object
fn getOBBoxPoints obj = (
	local obbPoints = #()

	-- World-space transform
	local worldSpaceXform = obj.transform

	-- World-space to object-space transform
	local objectSpaceXform = inverse worldSpaceXform

	-- Transform the object from world-space to object-space
	obj.transform *= objectSpaceXform

	-- Get the object-space axis-aligned bounding box corners
	aabbPoints = getAABBoxPoints obj

	-- Transform back to world-space
	obj.transform = worldSpaceXform

	-- Transform the eight corners from object-space to world-space
	for pt in aabbPoints do (
		append obbPoints (pt * worldSpaceXform)
	)

	return obbPoints
)

I’ve only tested this with a cube.

Hope it helps.

Thank you again for your help! This script works with a cube and also if the cube is rotated in the scene.
But some objects don’t have a bounding box that is aligned to the object’s axes, so I have to find out the orientation of the bounding box first. But how can I find this out while I only have the center point and the min and max distances?

Not sure if it’s quite what you’re after, but you could always find your own bounding box by finding the point which is furthest from the objects center in each direction in local space…

I thought about that, too. But wouldn’t that be the “bounding sphere” of an object? You have to go though all vertices and then calculate the center point and the point with the greatest distance to the center point, which is the radius of the sphere.

But I’m looking for the 8 corner points of the 3ds max’ bounding box, as shown in the attached picture. You can see that the bounding box doesn’t have to be aligned to the object’s local coordinate system, so I have to find out the orientation of the bounding box first.