deshu Napisano 22 Październik 2013 Napisano 22 Październik 2013 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.
deshu Napisano 23 Październik 2013 Autor Napisano 23 Październik 2013 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?
SUPER_OkO Napisano 24 Październik 2013 Napisano 24 Październik 2013 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
deshu Napisano 24 Październik 2013 Autor Napisano 24 Październik 2013 Jesteś świetny, zawsze pomagasz. Dokładnie o takie rozwiązanie mi chodziło. Dziękuje bardzo
deshu Napisano 25 Październik 2013 Autor Napisano 25 Październik 2013 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?
Kramon Napisano 25 Październik 2013 Napisano 25 Październik 2013 blender have it in standard! Ale dziwna sprawa że nie ma czegoś takiego w maxie standardowo. Jeżeli w softimage jest.
legomir Napisano 25 Październik 2013 Napisano 25 Październik 2013 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.
Kramon Napisano 25 Październik 2013 Napisano 25 Październik 2013 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
SUPER_OkO Napisano 25 Październik 2013 Napisano 25 Październik 2013 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...
Kramon Napisano 25 Październik 2013 Napisano 25 Październik 2013 (edytowane) 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 25 Październik 2013 przez Kramon
SUPER_OkO Napisano 25 Październik 2013 Napisano 25 Październik 2013 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.
Kramon Napisano 25 Październik 2013 Napisano 25 Październik 2013 (edytowane) 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 25 Październik 2013 przez Kramon
SUPER_OkO Napisano 25 Październik 2013 Napisano 25 Październik 2013 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ś.
deshu Napisano 25 Październik 2013 Autor Napisano 25 Październik 2013 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.
Kramon Napisano 25 Październik 2013 Napisano 25 Październik 2013 - musisz wiedzieć, że max też ma to w standardzie. Ja po prostu jestem grafikiem, i nie umiem tego jeszcze napisać.
legomir Napisano 25 Październik 2013 Napisano 25 Październik 2013 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?
deshu Napisano 25 Październik 2013 Autor Napisano 25 Październik 2013 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.
CgBartosz Napisano 25 Październik 2013 Napisano 25 Październik 2013 (edytowane) 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 28 Październik 2013 przez CgBartosz b
SUPER_OkO Napisano 28 Październik 2013 Napisano 28 Październik 2013 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
deshu Napisano 28 Październik 2013 Autor Napisano 28 Październik 2013 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)
CgBartosz Napisano 30 Październik 2013 Napisano 30 Październik 2013 (edytowane) 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 30 Październik 2013 przez CgBartosz
deshu Napisano 4 Listopad 2013 Autor Napisano 4 Listopad 2013 Dziękuje bardzo. Działa elegancko. Teraz musze to skumać zrozumieć:P
Rekomendowane odpowiedzi
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ę