Jump to content
deshu

[maxscript] dynamiczny array

Recommended Posts

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.

Share this post


Link to post
Share on other sites

Bardzo interesujący temat, o istnieniu którego nie miałem pojęcia:)

 

A czy jest coś, co mniej ingeruje w scene, a opiera się na samych zależnościach miedzyobiektowych?

Share this post


Link to post
Share on other sites

Mozesz zawsze tym boxom przypisać script controllera. Dołączyłem scenę bo nie chce mi się pisać tego wszystkiego. Zobacz jak to jest zbudowane i pewnie stanie się światłość.

 

test.zip

Share this post


Link to post
Share on other sites

Jesteś świetny, zawsze pomagasz. Dokładnie o takie rozwiązanie mi chodziło.

 

Dziękuje bardzo

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

blender have it in standard!

Ale dziwna sprawa że nie ma czegoś takiego w maxie standardowo. Jeżeli w softimage jest.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites
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.

Edited by Kramon

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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. :)

Edited by Kramon

Share this post


Link to post
Share on other sites

Jak grochem o ścianę. Boli mnie tylko to, że tacy ludzie, którzy nie mają nic do powiedzenia, pieprza bez opamiętania beztreściwe, bezwartościowe głupoty. Nic poza tym. Możesz klepać, kłapać, krzyczeć, mam już to gdzieś.

Share this post


Link to post
Share on other sites

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.

Share this post


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

 

maya+has+the+best+animation+tools.jpg

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites

Sorry Oko i legomir, ale poprosze Adka o porządek tu.

 

Legomir - noramlnie w skrypcie działa "in coordsys xxx", ale w script_controlerach z jakiegoś powodu nie chce.

Share this post


Link to post
Share on other sites

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.

Edited by CgBartosz
b

Share this post


Link to post
Share on other sites

Dzieki wielkie Bartek. Muszę przestudiować dokładnie ten zapis. Jestem jeszcze troche za glupi, żeby przyjąć taką dawkę zawiłości na klatę i zrozumieć wszystko na raz :D

Share this post


Link to post
Share on other sites

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)

Share this post


Link to post
Share on other sites

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

Edited by CgBartosz

Share this post


Link to post
Share on other sites

Dziękuje bardzo. Działa elegancko.

 

Teraz musze to skumać zrozumieć:P

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

We are using cookies. Read about our Privacy Policy