1
Python, skrypty, pluginy i Blender Game Engine / Odp: Modyfikator. Jest taki?
« dnia: 01.10.2017 10:02:01 »
No, coś tam wyskrobałem
Jedyny warunek dzałania to środek obiektu tam gdzie trzeba (w kostkach będzie w dobrym miejscu, jak nie to shift+ctrl+alt+c, origin to geometry)
Powstanie 25 losowo zduplikowanych obiektów od (0,0,0) w górę osi x. Wszystkie zostaną zaznaczone, żeby łatwo je było przenieść, obrócić itp Wrzucam też screena efektu
Jak chcesz zmienić ilość obiektów, w kodzie jest od tego zmienna. Jeszcze kiedyś powstanie z tego dodatek z interfejsem.
EDIT: mały update, wersja uwzględniająca przemieszczone środki obiektów:
Jedyny warunek dzałania to środek obiektu tam gdzie trzeba (w kostkach będzie w dobrym miejscu, jak nie to shift+ctrl+alt+c, origin to geometry)
Kod: [Zaznacz]
import bpy
from mathutils import Vector
from random import randrange
scene = bpy.context.scene
context = bpy.context
number_of_objects = 25
def dupli(object):
objdata = object.data.copy()
new_obj = bpy.data.objects.new('script-generated-mesh', objdata)
bpy.context.scene.objects.link(new_obj)
new_obj.scale = object.scale.copy()
# new_obj.rotation_euler = object.rotation_euler.copy()
return new_obj
def main():
to_dupli = []
for object in context.selected_objects:
to_dupli.append(object)
object.select = False
current_pos = Vector((0,0,0))
number_selected = len(to_dupli)
last_dim = 0
if (number_selected <= 0):
print("No objects selected!")
return
for x in range(number_of_objects):
object = to_dupli[randrange(0, number_selected)]
curr_dim = object.dimensions.x
print(object)
duplicate = dupli(object)
current_pos = current_pos + Vector(((last_dim + curr_dim)/2,0,0))
duplicate.location = current_pos
duplicate.select = True
last_dim = curr_dim
main()
Działanie jest proste, zaznaczasz obiekty, które mają tworzyć ciąg przełączasz się w wiodok scripting, tworzysz nowy dokument, wklejasz kod i klikasz alt+p (z myszą nad tekstem)Powstanie 25 losowo zduplikowanych obiektów od (0,0,0) w górę osi x. Wszystkie zostaną zaznaczone, żeby łatwo je było przenieść, obrócić itp Wrzucam też screena efektu
Jak chcesz zmienić ilość obiektów, w kodzie jest od tego zmienna. Jeszcze kiedyś powstanie z tego dodatek z interfejsem.
EDIT: mały update, wersja uwzględniająca przemieszczone środki obiektów:
Kod: [Zaznacz]
import bpy
from mathutils import Vector
from random import randrange
scene = bpy.context.scene
context = bpy.context
number_of_objects = 25
def dupli(object):
objdata = object.data.copy()
new_obj = bpy.data.objects.new('script-generated-mesh', objdata)
bpy.context.scene.objects.link(new_obj)
new_obj.scale = object.scale.copy()
# new_obj.rotation_euler = object.rotation_euler.copy()
return new_obj
def get_x_dim(object): #better to make function getting from center to left, from center to rigth. One of them to current, one of them to last ;)
bounding_box = [x[:] for x in object.bound_box]
max_x = max(bounding_box, key=lambda x: x[0])
min_x = min(bounding_box, key=lambda x: x[0])
return (max_x[0] - min_x[0]) * object.scale.x
def get_x_before(object):
bounding_box = [x[:] for x in object.bound_box]
min_x = min(bounding_box, key=lambda x: x[0])
return - min_x[0] * object.scale.x
def get_x_after(object):
bounding_box = [x[:] for x in object.bound_box]
max_x = max(bounding_box, key=lambda x: x[0])
return max_x[0] * object.scale.x
def main():
to_dupli = []
for object in context.selected_objects:
to_dupli.append(object)
object.select = False
current_pos = Vector((0,0,0))
number_selected = len(to_dupli)
last_dim = 0
if (number_selected <= 0):
print("No objects selected!")
return
for x in range(number_of_objects):
object = to_dupli[randrange(0, number_selected)]
curr_dim = get_x_before(object) #object.dimensions.x
print(object, ":", curr_dim)
duplicate = dupli(object)
current_pos = current_pos + Vector(((last_dim + curr_dim),0,0))
duplicate.location = current_pos
duplicate.select = True
last_dim = get_x_after(object)
main()
Jedyne kiedy może nie działać, to obiekt przeskalowany tylko w jednej osi i obrócony.
Użytkownicy, którzy podziękowali za ten post: misztal