Blender - 移动网格使最小Z点在Z = 0平面上

3

我想在Blender中移动一个网格,使其最低点的z值为0。这样最低点就会在Z = 0平面上。由于我首先按其最大轴缩放模型,所以这更具挑战性。我正在尝试使这对任何单个网格模型都适用。

这是我当前的尝试:

mesh_obj = bpy.context.scene.objects[0]
# I first find the min and max of the mesh. The largest and smallest points on the Z-axis
max_floats = [mesh_obj.data.vertices[0].co[0], mesh_obj.data.vertices[0].co[1], mesh_obj.data.vertices[0].co[2]]
min_floats = [mesh_obj.data.vertices[0].co[0], mesh_obj.data.vertices[0].co[1], mesh_obj.data.vertices[0].co[2]]

for vertex in mesh_obj.data.vertices:
    if vertex.co[0] > max_floats[0]:
        max_floats[0] = vertex.co[0]
    if vertex.co[0] < min_floats[0]:
        min_floats[0] = vertex.co[0]

    if vertex.co[1] > max_floats[1]:
        max_floats[1] = vertex.co[1]
    if vertex.co[1] < min_floats[1]:
        min_floats[1] = vertex.co[1]

    if vertex.co[2] > max_floats[2]:
        max_floats[2] = vertex.co[2]
    if vertex.co[2] < min_floats[2]:
        min_floats[2] = vertex.co[2]

max_float = max(max_floats)
min_float = min(min_floats)
# I then get the the point with the biggest magnitude
if max_float < math.fabs(min_float):
    max_float = math.fabs(min_float)


recip = 1.0 / max_float
# And use that point to scale the model
# This needs to be taken into account when moving the model by its min z_point
# since that point is now smaller
mesh_obj.scale.x = recip
mesh_obj.scale.y = recip
mesh_obj.scale.z = recip

# naive attempt at moving the model so the lowest z-point = 0
mesh_obj.location.z = -(min_floats[2] * recip / 2.0)

1
对于Blender特定的帮助,包括在Blender中使用Python脚本,您可能想使用blender.stackexchange.com - sambler
2个回答

8

首先你需要知道的是,顶点位置在物体空间中,也就是距离物体原点的距离。你需要使用物体的matrix_world将其转换为世界空间。

如果你只想让最低的z位置等于零,那么可以忽略x和y值。

import bpy
import mathutils

mesh_obj = bpy.context.active_object

minz = 999999.0

for vertex in mesh_obj.data.vertices:
    # object vertices are in object space, translate to world space
    v_world = mesh_obj.matrix_world * mathutils.Vector((vertex.co[0],vertex.co[1],vertex.co[2]))

    if v_world[2] < minz:
        minz = v_world[2]

mesh_obj.location.z = mesh_obj.location.z - minz

4

另一个解决方案:

def object_lowest_point(obj):
    matrix_w = obj.matrix_world
    vectors = [matrix_w * vertex.co for vertex in obj.data.vertices]
    return min(vectors, key=lambda item: item.z)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接