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