0

I have a lego 3D objects, in blender 2.92.0. And I would to set the origin to Matrix_world bottom center of Lego bricks's bound box, then set all bricks to z = 0.

I am a newbie in blender, so I'm trying run the code from batFINGER .

import bpy
from mathutils import Matrix, Vector

def origin_to_bottom(ob, matrix=Matrix()): me = ob.data mw = ob.matrix_world local_verts = [matrix @ Vector(v[:]) for v in ob.bound_box] o = sum(local_verts, Vector()) / 8 o.z = min(v.z for v in local_verts) o = matrix.inverted() @ o me.transform(Matrix.Translation(-o))

mw.translation = mw @ o

for o in bpy.context.scene.objects: if o.type == 'MESH': origin_to_bottom(o) #origin_to_bottom(o, matrix=o.matrix_world) # global

and this code:

from mathutils import Matrix, Vector
import numpy as np

def origin_to_bottom(ob, matrix=Matrix(), use_verts=False): me = ob.data mw = ob.matrix_world if use_verts: data = (v.co for v in me.vertices) else: data = (Vector(v) for v in ob.bound_box)

coords = np.array([matrix @ v for v in data])
z = coords.T[2]
mins = np.take(coords, np.where(z == z.min())[0], axis=0)

o = Vector(np.mean(mins, axis=0))
o = matrix.inverted() @ o
me.transform(Matrix.Translation(-o))

mw.translation = mw @ o    

enter image description here

It's looking like something is wrong, but I can't find out the reason. So, what can I do now?

Makalu
  • 1

1 Answers1

0

guys. I get the answer about the question. Thanks for the help from Martynas Žiemys

this is the code:

def origin_to_bottom(ob):
if ob.mode != 'OBJECT':
    bpy.ops.object.mode_set(mode='OBJECT', toggle=True)

d = ob.data m = ob.matrix_world

bounds_center = (sum((m @ Vector(b) for b in ob.bound_box), Vector()))/8 difference = m.translation - bounds_center local_difference = difference @ m for v in d.vertices: v.co += local_difference m.translation -= difference

difference = Vector((0,0,0)) bound = min((m @ v.co).z for v in d.vertices) difference.z = m.translation.z - bound

local_difference = difference @ m for v in d.vertices: v.co += local_difference m.translation -= difference

Makalu
  • 1