2015-01-20 2 views
1

Я пытаюсь переместить сетку в блендере так, чтобы самая низкая z-точка была z = 0. Это сделало бы самую низкую точку на плоскости Z = 0. Это сложнее, так как я сначала масштабирую модель по ее наибольшей оси. Это не единственный случай, с которым я работаю, поэтому я пытаюсь сделать эту работу для какой-либо одной модели сетки.Blender - перемещайте сетку так, чтобы наименьшая точка Z находилась на плоскости 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.stackexchange.com] (http://blender.stackexchange.com) – sambler

ответ

5

Первое, что вы должны знать, что позиции вершины в пространстве объекта - как в удалении от объектов происхождения. Вам нужно использовать объекты 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 
1

Другое решение:

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) 

 Смежные вопросы

  • Нет связанных вопросов^_^