Skocz do zawartości

Skrypt - dodawani hooks do każdego punktu Lattice


Rekomendowane odpowiedzi

Napisano

Witam.

Próbuję stworzyć skrypt tworzący hook w każdym punkcie siatki Lattice. Próbowałem w ten sposób:

for point in bpy.data.lattices['Lattice.001'].points:

bpy.ops.object.hook_add_newob()

 

jednak nic się nie dzieje po odpaleniu skryptu, nawet konsola nie pokazuje żadnego błędu

  • Odpowiedzi 8
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Napisano

bpy.ops.object.hook_add_newob() dodaje hooka do zaznaczenia, a dla lattice point devovie chyba nie przewidzieli mozliwosci zaznaczenia :) vertex i curve mają :|

wiec chyba nici ze skryptu

ps. aby ci zadziałał (cos robił) musisz wejsc w edit mode lattice, ale to ci zrobi kilka empty w srodku

Napisano

Właśnie próbowałem robić to w editmode :P.

Chce stworzyć hooki na każdym z puntków lattice i bardzo dobrze że zrobi obiekty empty o to właśnie mi chodzi. Jednak nie chce każdego punktu osobno zaznaczać i dodawać hooka, chce to skryptem załatwić jakoś :)

Napisano (edytowane)

to jest kod który robi to co chesz ale na meshu

import bpy

# retrieve the active object
bpy.ops.object.mode_set(mode = 'OBJECT')
obj = bpy.context.active_object
i = 0
for vert in obj.data.vertices:
   # deselect everything
   bpy.ops.object.mode_set(mode = 'EDIT')
   bpy.ops.mesh.select_all(action = 'DESELECT')

   # reselect the originally selected face
   bpy.ops.object.mode_set(mode = 'OBJECT')
 [b]  obj.data.vertices[i].select = True[/b]
   i+=1

   #adding hook
   bpy.ops.object.mode_set(mode = 'EDIT')
   bpy.ops.object.hook_add_newob()

wg mnie, brak odpowiednika w latticepoint dla obj.data.vertices.select sprawia, uniemożliwia napisanie tego dla lattice

 

tak wygladałoby to dla lattice gdyby latticePoint miał "select"

import bpy

# retrieve the active object
bpy.ops.object.mode_set(mode = 'OBJECT')
obj = bpy.context.active_object
i = 0
for vert in obj.data.points:
   # deselect everything
   bpy.ops.object.mode_set(mode = 'EDIT')
   bpy.ops.lattice.select_all(action = 'DESELECT')

   # reselect the originally selected face
   bpy.ops.object.mode_set(mode = 'OBJECT')
  [b] obj.data.points[i].select = True  #     i+=1

   #adding hook
   bpy.ops.object.mode_set(mode = 'EDIT')
   bpy.ops.object.hook_add_newob()

Edytowane przez szczuro
Napisano

No tak to wygląda sensownie, jeszcze próbowałem z innej strony to zrobić, czyli najpierw by zrobić obiekty Empty w miejscach punktów Lattice i potem na tych punktach zrobić hooki do tych Empty, tyle że tu wcześniej mi wyskakuje problem, ale chyba będzie lepiej jak pokażę cały skrypt i jego idee:

 

import bpy

 

plajtl = bpy.context.active_object.location

 

plajt = bpy.context.active_object

 

print(plajtl)

 

print(plajt)

 

plajtm = plajt.name

 

plajtd = bpy.data.objects[plajtm].dimensions

 

plajtr = bpy.data.objects[plajtm].rotation_euler

 

print(plajtd)

 

bpy.ops.object.add(type='LATTICE', location=(plajtl))

lat = bpy.context.active_object

lat.name = lat.name + "_" + plajtm

latm = lat.name

 

latmid = bpy.context.active_object.data.name

 

bpy.data.objects[latm].scale = plajtd

bpy.data.objects[latm].rotation_euler = plajtr

print(bpy.data.objects[latm].scale)

 

plajtdx = bpy.data.objects[plajtm].dimensions.x * 2.8

plajtdy = bpy.data.objects[plajtm].dimensions.y * 2.8

print(plajtdx)

 

bpy.data.lattices[latmid].points_u = plajtdx

print(bpy.data.lattices[latmid].points_u)

 

bpy.data.lattices[latmid].points_v = plajtdy

print(bpy.data.lattices[latmid].points_v)

 

for point in bpy.data.lattices[latmid].points:

poi = point.co + bpy.data.objects[latm].location

bpy.ops.object.add(location=(poi))

 

A więc chodzi o to że mamy zaznaczony Plane, po uruchomieniu skryptu tworzy w jego miejscu Lattice, którego przeskalowuje do wymiarów Plane.

 

plajtdx = bpy.data.objects[plajtm].dimensions.x * 2.8

plajtdy = bpy.data.objects[plajtm].dimensions.y * 2.8

print(plajtdx)

 

bpy.data.lattices[latmid].points_u = plajtdx

print(bpy.data.lattices[latmid].points_u)

 

bpy.data.lattices[latmid].points_v = plajtdy

print(bpy.data.lattices[latmid].points_v)

 

ten fragment tworzy podziały Lattice ze względu na wymiary Plane.

 

for point in bpy.data.lattices[latmid].points:

poi = point.co + bpy.data.objects[latm].location

bpy.ops.object.add(location=(poi))

 

I na końcu tworzenie obiektów empty, które niestety wstawiają się w miejsce punktów lattice ale przed przeskalowaniem :/

Napisano

siedziałem nad tym troche, (poczysciłem treoche, wg mnie robisz za duzo zmiennych) ale dalej nie jest idealnie, bo nie bierze pod uwage obrotu i nie chce mi sie myslec jak to zrobić :)

import bpy
obj  = bpy.context.active_object

bpy.ops.object.add(type='LATTICE', location=obj.location)
lat = bpy.context.active_object
lat.name +="_" + obj.name

lat.scale = obj.dimensions
lat.rotation_euler = obj.rotation_euler

lat.data.points_u = obj.dimensions.x * 2.8
lat.data.points_v = obj.dimensions.y * 2.8

for point in lat.data.points:
[b]    poi = (point.co*lat.matrix_world+lat.location)[/b] //głowna zmiana to *lat.matrix_world
   bpy.ops.object.add(location=(poi))

Napisano

Ja osobiście bym to zrobił tak.

Jeżeli nie mogę użyć lattice to stworzyłbym Cube i odpowiednio dodał edge loops.

Następnie przesunąłbym Cuba nad obiekt który ma być edytowany.

W obiekcie tym użyłbym modyfikatora MeshDeform.

Ręcznie wskazałbym obiekt itp.

Zaznaczyłbym Cube i użył skryptu który szczuro pokazał na samym początku.

Nie wiem czy takie rozwiązanie Cie satysfakcjonuje. Nie wiem czy takie rozwiązanie Ci się przyda ale wydaje mi się ,że kombinując stracisz więcej czasu niż rzeczywiście jest to potrzebne. Sprawdzałem na Cubie i Monkey i działa.

Napisano

faktycznie na MeshDeform jest to o wiele prostsze, ale konkretnie potrzebuje lattice by modyfikować za pomocom jego plane więc wszystko na płaskich powierzchniach by się odbywało, z MeshDeform muszę użyć obiektu który nie będzie płaski, więc dojdą mi dodatkowe punty vertex, które już stają się problematyczne

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności