Autor Wątek: Modyfikator. Jest taki?  (Przeczytany 1194 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Online misztal

Modyfikator. Jest taki?
« dnia: 29.09.2017 23:35:37 »


Mam różnego rozmiaru modele, sześciany. Chce je ustawić jeden obok drugiego bez kolizji i wolnych przestrzeni w osi x losowo. Czy spotkał się ktoś z addonem dającym takie możliwości? Lub wie jak napisać taki addon?
 

Offline goten22

Odp: Modyfikator. Jest taki?
« Odpowiedź #1 dnia: 30.09.2017 02:47:20 »
Nie znam takiego addonu.

A może jakoś systemem cząsteczek?
 

Offline wefhy

Odp: Modyfikator. Jest taki?
« Odpowiedź #2 dnia: 30.09.2017 21:28:09 »
Ciekawy challenge, chyba spróbuję napisać taki addon, wygląda na coś w miarę prostego, a przynajmniej sobie przypomnę API(miałem w planach rozpoczęcie serii przydatnych skryptów, więc coś takiego idealnie się wpasuje). Możesz zerknąć w tym tygodniu w ten wątek, jak znajdę czas, to wstawię kod. Przy okazji jak będziesz chciał, to podpatrzysz, jak jest zrobiony.

PS Witam wszystkich ponownie na nowej wersji forum ;) (szkoda, że stare konta się nie zapisały - ale pewnie jest już o tym jakiś wątek, więc poszukam i sobie poczytam)
 

Offline PawelB

Odp: Modyfikator. Jest taki?
« Odpowiedź #3 dnia: 01.10.2017 03:00:40 »
Od takich rzeczy są np. Animation Nodes

Online misztal

Odp: Modyfikator. Jest taki?
« Odpowiedź #4 dnia: 01.10.2017 09:07:39 »
Dzięki za odpowiedzi. Tylko czy mogę mieć różne rozmiary obiektów. muszę to sprawdzić. Jak narazie mam plan b, użycie tego generatora on daje takie możliwości, ale samo dodanie obiektów jest czasochłonne i mam możliwość dania wymiarów 2, 4. Nie mogę dać dowolnego.
http://cgchan.com
 

Offline wefhy

Odp: Modyfikator. Jest taki?
« Odpowiedź #5 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)
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:
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.
« Ostatnia zmiana: 01.10.2017 10:26:48 wysłana przez wefhy »
 
Użytkownicy, którzy podziękowali za ten post: misztal

Online misztal

Odp: Modyfikator. Jest taki?
« Odpowiedź #6 dnia: 01.10.2017 17:10:11 »
Działa super. Dziękuje, zaoszczędzę dzięki temu wiele godzin pracy.
 

 

PRZENIESIONY: jak stworzyć taki efekt?

Zaczęty przez goten22Dział Tender Blender

Odpowiedzi: 0
Wyświetleń: 744
Ostatnia wiadomość 20.08.2017 17:44:00
wysłana przez goten22
jak stworzyć taki efekt?

Zaczęty przez razrobakDział Montaż i postprodukcja

Odpowiedzi: 3
Wyświetleń: 1384
Ostatnia wiadomość 13.11.2017 04:01:11
wysłana przez Srutinrun

* Zaloguj




* Losowy obrazek