模型的长宽高在写一些需要计算的插件时还是挺有用的,可以通过object.dimensions(模型尺寸)知道,可是遇到复数模型组成的物体计算长宽高就比较麻烦了,像我这个模型就是复数子模型组成的,用一个空物体当父级
两个方法:方法一,把复数模型合并成一个模型;方法二,通过顶点计算出长宽高
方法一代码
selected_objects = bpy.context.selected_objects
bpy.context.view_layer.objects.active = selected_objects[0]
bpy.ops.object.join()
这样就可以通过object.dimensions(尺寸)知道长宽高了,麻烦的是需要还原成复数模型,我的解决方法是复制模型,把复制的模型合成一个模型获得长宽高后删除这个合成的模型,这样就可以避免动原模型了
方法二,本来想通过循环顶点来计算长宽高的,结果发现耗时太长了,就找其他方法,在object的属性里发现了bound_box属性,这个属性是用来画边框用的,那我就可以用这8个顶点来计算最大值和最小值
贴代码
from mathutils import Vector
def get_object_size(parent_object):
is_start = False
max_x = 0.0
max_y = 0.0
max_z = 0.0
min_x = 0.0
min_y = 0.0
min_z = 0.0
for obj in parent_object.children:
box_corners = [obj.matrix_world @ Vector(corner) for corner in obj.bound_box]
for v in box_corners:
x = v[0]
y = v[1]
z = v[2]
if is_start:
max_x = max(max_x, x)
max_y = max(max_y, y)
max_z = max(max_z, z)
min_x = min(min_x, x)
min_y = min(min_y, y)
min_z = min(min_z, z)
else:
is_start = True
max_x = x
max_y = y
max_z = z
min_x = x
min_y = y
min_z = z
width = max_x - min_x
height = max_y - min_y
length = max_z - min_z
dimensions = (width, height, length)
return dimensions
通过obj.matrix_world计算出该顶点的世界坐标,然后通过各个轴的最大值和最小值计算出长宽,最后的命名请无视掉,出于习惯把x轴当宽,y轴当高了