Skocz do zawartości

[maxscript] dynamiczny array


deshu

Rekomendowane odpowiedzi

Hejka.

 

Próbuje stworzyć w maxie coś w tym guście:

 

https://vimeo.com/72048058 (moment z 3:40)

 

W skrócie:

-mam dwa obiekty kontrolujące, b1 i b2.

-skrypt dorabia podaną ilość kopii

-ustawia kopie (pozycje, rotacje i skale) na podstawie różnicy b2-b1

-tworzy dynamiczne połączenie, tak abym mógł interaktywnie we viewporcie sobie manipulować efektem.

 

Pierwsze 3 punkty udało mi się zrealizować:

(wystarczy odpalić w świeżej scenie)

delete objects

b1 = ChamferBox()
b2 = ChamferBox()
b1.length = b1.width = b1.height = b2.length = b2.width = b2.height = 25
b1.fillet = b2.fillet = 2

b2.pos.x = 7
b2.pos.z = 40

about b2 rotate b2 ((eulerAngles 3 5 7) as angleaxis )


boxes = #()
while boxes.count 
for i = 1 to boxes.count do(
   m = i + 1

   obj = boxes[i]

   rot = (b2.rotation - b1.rotation) as eulerAngles
   rot.x *= m
   rot.y *= m
   rot.z *= m
   obj.rotation = eulerToQuat rot

   obj.pos = (b2.pos - b1.pos)*m
)

 

 

Potrzebuje pomocy, jakiegoś naprowadzenia, jak zabrać się za tą interaktywność.

Gdyby tylko wire parameters pozwalało na połączenia miedzy większą ilością obiektów, niż dwóch.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 22
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Ok, wykręciłem coś takiego:

 

delete objects

--create control objects
b1 = box()
b1.wirecolor = (color 130 0 0)
b1.pivot = b1.center
move b1 [0, 0, -b1.width/2]
maxOps.cloneNodes b1 cloneType:#instance newNodes:&b2arr
b2 = b2arr[1]
move b2 [0, 0, 25]

parent = b2
copies = #()

for i = 1 to 85 do (

   maxOps.cloneNodes b2 offset:[0, 0, 25 * i ] cloneType:#instance newNodes:&ins

   curBox = ins[1]
   curBox.wirecolor = (color 30 30 30)
   curBox.parent = parent

   posCtrl = curBox.position.controller = position_script()
   posCtrl.addNode "b1" b1
   posCtrl.addNode "b2" b2
   posCtrl.script = "b2.pos - b1.pos"

   rotCtrl = curBox.rotation.controller = rotation_script()
   rotCtrl.addNode "b1" b1
   rotCtrl.addNode "b2" b2
   rotCtrl.script = "b1.rotation - b2.rotation"

   scaleCtrl = curBox.scale.controller = scale_script()
   rotCtrl.addNode "b1" b1
   rotCtrl.addNode "b2" b2
   scaleCtrl.script = "b1.scale + (b2.scale - b1.scale)"


   -- assign next parent for next iteration
   parent = curBox
)

 

Pozostaje jeszcze tylko problem skalowania, które powinno dziać się w koordynatach lokalnych, a dzieje się w globalnych.

 

Próbowałem "in coordsys local", ale niestety nie działało.

 

Jak to wstawić w script_controller?

Odnośnik do komentarza
Udostępnij na innych stronach

Kramon zdajesz sobie, że Maya, Max, Softimage to zupełnie rożne programy napisane przez zupełnie kogoś innego mające w zamyśle robić zupełnie co innego? Nie wspominając, że to jest zależne od języka skryptów w Maxie masz Maxscripta i chyba w tym roku dodali pythona w SI masz język skryptowy XSI(nie pamiętam jak się nazywa :P ), jscipta albo jave i pythona, w Mayi masz MEL, pyMEL, pythona i pythona pod API bezpośrednio dodatkowo możesz sobie dodać np. seExpression.

 

Nie wspominam też, że każdy z tych programów ma oddzielną filozofie budowy.

Odnośnik do komentarza
Udostępnij na innych stronach

Ale tu nie chodzi o to że to tam było napisane w innym jęzku jeżeli koleś który cośtam kmini z kodu może sobię to napisać. Chodzi o zasady. To jest błachostka która daje naprawdę dużo. i jeżeli umieścili ją tu to mogli by i tam.

 

Co do tych ludzi to :D Maykę teraz piszą ludzie od Softimage :D

Odnośnik do komentarza
Udostępnij na innych stronach

Deshu spoko, można fajnie rozwinąć te skrypcik i powstanie narzędzie do wielu zastosowań. Do skalowania lokalnego możesz wykożystać chyba Xforma i skalować jego gizmo.

 

Kramon jakim trzeba być upośledzonym dzieciakiem, żeby wsadzać tutaj takie wstawki. Mam na prawdę głęboko w dupie co potrafi Blender. Co ma piernik do wiatraka...

Odnośnik do komentarza
Udostępnij na innych stronach

Kramon jakim trzeba być upośledzonym dzieciakiem, żeby wsadzać tutaj takie wstawki. Mam na prawdę głęboko w dupie co potrafi Blender. Co ma piernik do wiatraka...

 

Zastanów się nad sobą skoro cię tak to boli. Wstawiłem for fun.

i kto tu jest dzieciakiem po za tym. Odrazu zaczynasz mnie obrażać niczym dziecko z podstawówki, no i kultura wypowiedzi też sporo świadczy.

Edytowane przez Kramon
Odnośnik do komentarza
Udostępnij na innych stronach

To nie jest for Fun tylko żenada. Wkurzają mnie twoje ciągłe wstawki co to nie Blender... w wątkach komletnie na inny temat. Szkoda tylko, że użytkownicy Blendera nie potrafią nic stworzyć ciekawego mając tyle fajnych narzędzi. Kutura wypowiedzi świadczy tylko o tym jak mi działasz na nerwy, wsadzając swoje bezwartościowe 3 grosze wszędzie.

Odnośnik do komentarza
Udostępnij na innych stronach

To nie jest for Fun tylko żenada. Wkurzają mnie twoje ciągłe wstawki co to nie Blender... w wątkach komletnie na inny temat. Szkoda tylko, że użytkownicy Blendera nie potrafią nic stworzyć ciekawego mając tyle fajnych narzędzi. Kutura wypowiedzi świadczy tylko o tym jak mi działasz na nerwy, wsadzając swoje bezwartościowe 3 grosze wszędzie.

 

Boli cię to jak cholera musisz nad sobą popracować naprawdę :) zachowujesz się jakbym krzywdził twoją rodzinę.

Co do tego że nie potrafią nic stworzyć ciekawego, Ow realy? Czekaj no ale to galerie maxa czy blendera są zalane nudnymi do wyrzygu wizkami albo renderami aut. Jak dla ciebie to jest ciekawe to pozdrawiam. Niechce kolejnej dykusji blender vs reszta świata. Ty natomiast możesz sobie za żartować że blender niema czegoś czego nie ma równierz Max ani Maya, pluginy te napisały zostały przez zewnętrzną firmę. No co do tej ciekawości to wolę takie prace niż hiper realistyczne interiory które wieją nudą.

 

 

Co naj istotniejsze, są to zrobione prace przez osoby które traktują to jako zabawe hobby, a nie przez studio. :)

Edytowane przez Kramon
Odnośnik do komentarza
Udostępnij na innych stronach

Kramon, jeżeli już musisz dodawać tu swoje "blender ma to w standardzie", to:

- musisz wiedzieć, że max też ma to w standardzie. Ja po prostu jestem grafikiem, i nie umiem tego jeszcze napisać.

- serdecznie cie proszę, wywal chociaż obrazki z tego wątku, bo śmiecą niemiłosiernie.

 

 

SUPER_OkO - dzięki za kolejną podpowiedź. Pewnie jutro bede mógł dopiero sprawdzić. Nie pomyslałem zupełnie o modyfikatorach. XForm powinien dać rade. Tylko chyba nie będę mógł już mógł mieć instancji tych boxów, tylko klony.

Odnośnik do komentarza
Udostępnij na innych stronach

Co do tych ludzi to :D Maykę teraz piszą ludzie od Softimage :D

 

Gadasz głupoty. Ludzi od XSI są teraz w MayaFX Montreal, część pisze Fabric Engine/creation horde część o ile się orientuje współpracuje też przy Bifroscie(chodzi o to aby system od wewnątrz był bardziej elastyczny) Autodesk równie dobrze mógł ich rzucić to pracy nad integracja Bifrosta z Maxem to raz. Dwa to iż jeżeli Blendera piszą 3 osoby czy ile tam ma programistów obecnie nie oznacza, że jest tak z innymi softami. 3 Co do ostatniego posta to po co ludzie piszą addony do Blendera przecież pisze masa ludzi.

 

@Deshu nie wiem jak to działa, ale nie możesz skalować w ten sposób, że konwertujesz local space do world space?

Odnośnik do komentarza
Udostępnij na innych stronach

Cześć,

 

Zerknijcie czy taki setup zachowuje się jak należy.

Wystarczy uruchomić skrypt, a całość się wygeneruje.

Transformacja jest kontrolowana przez pierwszy utworzony

obiekt który po wykonaniu zostanie zaznaczony.

 

struct TransformInheritanceSetup (    
   mCount = 0,
   mNodeFN = point,
   fn createInheritance count mNodeFN = (
       prev = undefined
       first = undefined
       color_step = 255.0 / count
       color_curr = 0.0
       for i = 1 to count do (
           curr = mNodeFN()
           curr.wirecolor = (color (255-color_curr)  (255-color_curr ) color_curr )
           color_curr +=color_step
           if first == undefined do (
               first = curr 
           )
           if prev != undefined do (
               tm_script = curr.transform.controller = transform_script()
               tm_script.addNode "prev" prev
               tm_script.addNode "first" first
               tm_script.script = "first.transform * prev.transform"
           )
           prev = curr
       )
       return first
   ),
   on create do (
       first = createInheritance mCount mNodeFN
       first.transform = (matrix3 [0.863505,0.445805,0] [-0.445805,0.863505,0] [0,0,0.971794] [49.3829,-1.52119e-006,34.8007])
       select first
   )
)
resetMAxFile #noprompt
TransformInheritanceSetup 90 box


 

Chciałem dodać trzy grosze o Callbacks o któych pisał Super_Oko.

W powyższym kodzie mNodeFN to jest taki prosty przykład callbacku.

Zmienna tak "wskazuje" na byt "wywoływalny" czyli funkcje lub funktor.

Na przyklad aby stworzyc box mozna przekazac poprostu funkcje "box":

TransformInheritanceSetup 90 box

Można także przekazać własną funkcje konkretyzującą tworzenie dowolnego obiektu, o tak:

fn MojaFunkcjaTworzaca = (
    cb = chamferBox()
    cb.fillet = 2.0
    return cb
)

TransformInheritanceSetup 90 MojaFunkcjaTworzaca 

 

Ta funkcje jest wołana z createInheritance, przy

tworzeniu obiektu. Nie przyjmuje ona żadnych argumentów i zwraca

stworzony obiekt.

curr = mNodeFN()

 

W maxie Callbacks działają bardzo podobnie. Definiuje się funkcję w globalnym zakresie

maxscript i są one wywoływane przy pewnych zdarzeniach.

Na przykład gdy użytkownik zmienia nazwę obiektu, lub resetuje scene.

Edytowane przez CgBartosz
b
Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki Bartosz!

 

Bardzo ciekawa konstrukcja. Nie wiedziałem tez w ogóle o 'struct'.

Nie wiedziałem też, o script_controlerze dla całego transforma, zamiast translacji/rotacji/skali osobno - miła sprawa.

 

Niestety, problem z nielokalnym skalowaniem w twoim kodzie też występuje.

(Gdy skalujemy proporcjonalnie, wszystko gra, ale gdy skalujemy osobno x/y/z, to transformacja jest nadawana wg. osi sceny, nie lokalnych)

Odnośnik do komentarza
Udostępnij na innych stronach

Tylko skaluj obiekt po lokalu

 

struct TransformInheritanceSetup (    
   mCount = 0,
   mNodeFN = point,

   fn createBoxTree count mNodeFN = (
       prev = undefined
       first = undefined

       color_step = 255.0 / count
       curr_color = 0.0

       for i = 1 to count do (
           curr = mNodeFN()
           curr.wirecolor = (color (255-curr_color)  (255-curr_color ) curr_color )

           curr_color +=color_step

           if first == undefined do (
               first = curr 
           )

           if prev != undefined do (
               tm_script = curr.transform.controller = transform_script()

               tm_script.addNode "prev" prev
               tm_script.addNode "first" first

               script = "tm = first.transform *  prev.transform\n"
               script += "new_tm = matrix3 1\n"
               script += "new_tm = preTranslate new_tm tm.translation\n"
               script += "new_tm = preRotate new_tm tm.rotationPart\n"
               script += "new_tm = preScale new_tm tm.scale\n"
               script+= "new_tm"

               tm_script.script = script
           )
           prev = curr
       )
       return first
   ),
   on create do (
       first = createBoxTree mCount mNodeFN
       first.transform =(matrix3 [0.8934,-0.437109,-0.0564497] [0.423136,0.876705,-0.0918574] [0.0919343,0.0596676,0.99297] [-39.7169,68.2191,10.7382])

       select first
   )
)

fn MojaFunkcjaTworzaca = (
   cb = chamferBox()

   cb.length = 30
   cb.height= 30
   cb.width= 30
   cb.fillet = 2.0

   return cb
)

resetMAxFile #noprompt
TransformInheritanceSetup 250 MojaFunkcjaTworzaca

Edytowane przez CgBartosz
Odnośnik do komentarza
Udostępnij na innych stronach

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