9
$\begingroup$

I want to compute the total scene bounding box, so I can fit the scene in rendered image automatically. I have found bound_box. But why are there so many values

<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>
<bpy_float[3], Object.bound_box>

There should be 6 values (x_min,y_min,z_min) and (x_max,y_max,z_max)

$\endgroup$
3
  • 1
    $\begingroup$ related: blender.stackexchange.com/questions/14073/… $\endgroup$
    – p2or
    Commented Jun 11, 2015 at 16:00
  • $\begingroup$ maybe you run the code twice and didn't realize, what code are you using and what object? (screenshots welcome) $\endgroup$
    – zeffii
    Commented Jun 11, 2015 at 16:43
  • $\begingroup$ @zeffi I probably did that $\endgroup$
    – user877329
    Commented Jun 11, 2015 at 16:57

2 Answers 2

22
$\begingroup$

You will get 8 values only,

>>> obj = bpy.context.active_object
>>> obj.bound_box
bpy.data.objects['Cube'].bound_box

>>> [v[:] for v in obj.bound_box]
[(-1.0, -1.0, -1.0), 
 (-1.0, -1.0, 1.0),
 (-1.0, 1.0, 1.0),
 (-1.0, 1.0, -1.0),
 (1.0, -1.0, -1.0),
 (1.0, -1.0, 1.0),
 (1.0, 1.0, 1.0),
 (1.0, 1.0, -1.0)]

enter image description here

for Suzanne it would be:

enter image description here

Here's some code I wrote about 2 years ago to get x.min, x.max, etc., and distance over the axis for x, y and z. With instructions how to use it. (I have this tucked away in a module so I just import the function when I need it)

import bpy
from mathutils import Vector
 
def bounds(obj, local=False):
 
    local_coords = obj.bound_box[:]
    om = obj.matrix_world
 
    if not local:
        # Use @ for multiplication instead of * in Blender2.8+. Source: https://blender.stackexchange.com/a/129474/138679
        worldify = lambda p: om * Vector(p[:]) 
        coords = [worldify(p).to_tuple() for p in local_coords]
    else:
        coords = [p[:] for p in local_coords]
        
    rotated = zip(*coords[::-1])
    
    push_axis = []
    for (axis, _list) in zip('xyz', rotated):
        info = lambda: None
        info.max = max(_list)
        info.min = min(_list)
        info.distance = info.max - info.min
        push_axis.append(info)
    
    import collections
    
    originals = dict(zip(['x', 'y', 'z'], push_axis))
     
    o_details = collections.namedtuple('object_details', 'x y z')
    return o_details(**originals)
 
""" 
obj = bpy.context.object
object_details = bounds(obj)

a = object_details.z.max
b = object_details.z.min
c = object_details.z.distance

print(a, b, c)

"""
$\endgroup$
2
  • $\begingroup$ Ah, so it contains the coordinates of the box vertices. Then I need to loop to find the two min and max points $\endgroup$
    – user877329
    Commented Jun 11, 2015 at 16:52
  • 1
    $\begingroup$ For the above, change * to @ in worldify = lambda p: om * Vector(p[:]) for Blender 2.8x and above. Otherwise element-wise multiplication error will occur. $\endgroup$
    – DrewTNBD
    Commented Jul 1, 2021 at 9:25
2
$\begingroup$

Each object that has a bound_box property will return 8 values that represent the bounding information. The 8 values describe the corners of the bounding box itself.

If you have 16 values I presume that is because you have 2 objects in the scene (though it isn't clear from your question what you might have typed in to return all 16 values).

$\endgroup$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .