lechoo Napisano 8 Grudzień 2003 Napisano 8 Grudzień 2003 Moj skrypt na poczatek clearListener() utility kurs05 \"Area Light\" ( local lights_arr = #() pickbutton area_object \"Select object\" width:130 spinner nth_vertex \"Every nth vert: \" type:#integer range:[1,100,1] fieldwidth:40 button go \"GO\" width:130 button deletelights \"Delete lights\" width:130 on go pressed do ( disableSceneRedraw() addModifier area_object.object (edit_mesh()) first_light = omnilight pos:(getVert area_object.object 1) multiplier:(1.0/area_object.object.numVerts) append lights_arr first_light for i in 2 to area_object.object.numVerts by nth_vertex.value do ( next_light = instance first_light next_light.pos = getVert area_object.object i append lights_arr next_light ) deleteModifier area_object.object 1 enableSceneRedraw() ) on deletelights pressed do ( for i in 1 to lights_arr.count do ( delete lights_arr[lights_arr.count] deleteItem lights_arr lights_arr.count ) ) ) Teraz kilka ciekawszych miejsc. Petla on go pressed (czyli ta w ktorej tworze swiatla) zaczyna sie od disableSceneRedraw() a konczy enableSceneRedraw(). Dzieki temu max nie bedzie odswiezal viewportow po stworzeniu kazdego swiatla. Przy duzej ilosci obliczen i obiektow tak jest szybciej. Jesli zdarzy sie tak ze skrypt zwali sie gdzies pomiedzy tymi liniami trzeba pamietac o wywolaniu z osobnego skryptu enableSceneRedraw() inaczej viewporty pozostana wylaczone dlatego te dwie linijki dopisuje zawsze na koncu jak skrypt jest juz sprawdzony. Jesli obiekt nie jest typu editable mesh to nie mozna dobrac sie do jego vertexow. addModifier area_object.object edit_mesh()) deleteModifier area_object.object 1 Ja rozwiazalem to dodajac modyfikator edit mesh na czas obliczen. Wiekszosc z was wykorzystala snapshot. Wszystkie swiatla wrzucam do tablicy, dzieki temu mode je potem kasowac lub zrobic z nimi cos innego. local lights_arr = #() append lights_arr first_light first_light = omnilight pos:(getVert area_object.object 1) multiplier:(1.0/area_object.object.numVerts) Zwroccie uwage na wartosc multiplier. Gdybym zostawil ja na defaultowej wartosci 1 to przy np 100 swiatlach nasze area light mialoby multiplier 100, czyli wszystko byloby przepalone. Dzieki temu dzieleniu cale area light ma multiplier = 1.
lechoo Napisano 8 Grudzień 2003 Autor Napisano 8 Grudzień 2003 Autor: Bart Utility AreaLight \"Area Light\" ( local pozycja, sw, num_vert, kula, pierwsze, tablica, promien = 20, segmenty = 2, jasnosc = 1.0, kolor, czy_istnieje = 0 label l1 \"\" pickbutton light \"Wybierz swiatlo\" label l2 \"\" group \"Parametry Area Light\" ( spinner pr \"Promien\" range:[10,100,20] spinner gestosc \"Segmenty\" range:[1,6,2] type:#integer spinner jasn \"Jasnosc\" range:[0,100,1] colorpicker kol \"Kolor\" align:#center label l3 \"\" button create \"Utworz Area Light\" label l4 \"Progress\" progressBar progres ) label l5 \"\" button del \"Skasuj Area Light\" enabled:false label l6 \"\" on pr changed wartosc do promien = wartosc on gestosc changed wartosc do segmenty = wartosc on jasn changed wartosc do ( if czy_istnieje == 1 then ( jasnosc = wartosc pierwsze.multiplier = (jasnosc/num_vert) ) else jasnosc = wartosc ) on kol changed wartosc do ( if czy_istnieje == 1 then ( kolor = wartosc pierwsze.rgb = kolor ) else kolor = wartosc ) on light picked swiatlo do ( light.text = swiatlo.name sw = swiatlo select swiatlo pozycja = swiatlo.pos jasnosc = sw.multiplier jasn.value = jasnosc kolor = sw.rgb kol.color = kolor ) on create pressed do ( pr.enabled = false gestosc.enabled = false create.enabled = false del.enabled = true czy_istnieje = 1 kula = geosphere segments:segmenty radius:promien kula.pos = pozycja sw.enabled = false siatka = snapshotAsMesh kula num_vert = siatka.numverts poz = getVert siatka 1 pierwsze = omnilight pos:poz castShadows:true rgb:kolor pierwsze.multiplier = (jasnosc/num_vert) hide kula tablica = #() tablica[1] = pierwsze for i = 2 to num_vert do ( poz = getVert siatka i tablica = instance pierwsze tablica.pos = poz Tablica.multiplier = pierwsze.multiplier progres.value = i*100/num_vert ) ) on del pressed do ( pr.enabled = true gestosc.enabled = true create.enabled = true del.enabled = false czy_istnieje = 0 sw.enabled = true unhide kula select kula delete selection for i = 1 to num_vert do ( select tablica delete selection ) ) ) Jedyne zastrzerzenia jakie mam to z gory okreslony ksztalt area light, przydalaby sie mozliwosc wyboru obiektu na ktory sa tworzone swiatla. Bart jest jedyna osoba ktora zauwarzyla problem z multiplierem. Gratuluje.
lechoo Napisano 8 Grudzień 2003 Autor Napisano 8 Grudzień 2003 Autor: leander tmesh = snapshotAsMesh selection[1] a = omnilight() num_verts = tmesh.numverts for v = 1 to num_verts do ( vert = getVert tmesh v b = instance a pos:vert ) Leander jest absolutnym rekordzista jesli chodzi o zwiezlosc, ale jest wszystko co trzeba. Przydalby sie moze jakis symboliczy interface albo podpiecie do guziczka jako macroscript.
lechoo Napisano 8 Grudzień 2003 Autor Napisano 8 Grudzień 2003 Autor: leander tmesh = snapshotAsMesh selection[1] a = omnilight() num_verts = tmesh.numverts for v = 1 to num_verts do ( vert = getVert tmesh v b = instance a pos:vert ) Leander jest absolutnym rekordzista jesli chodzi o zwiezlosc, ale jest wszystko co trzeba. Przydalby sie moze jakis symboliczy interface albo podpiecie do guziczka jako macroscript.
lechoo Napisano 8 Grudzień 2003 Autor Napisano 8 Grudzień 2003 Autor: Sypo clearListener() global obiekt for i = 1 to selection.count do ( obiekt = convertToMesh(selection) ) num_verts = obiekt.numverts pierwsze = omnilight pos:(getVert obiekt 1) for v = 2 to 4 do ( vert = getVert obiekt v drugie = instance pierwsze drugie.pos = vert ) trzecie = targetDirectionalLight pos:(getVert obiekt 5) target:(targetObject pos:[0,0,200]) for v = 6 to num_verts do ( vert = getVert obiekt v czwarte = instance trzecie czwarte.pos = vert ) Sypo niestety nie mial czasu dokonczyc skryptu. Jak widac probowal eksperymentowac ze swiatlami target zamiast omni (i slusznie tez bedzie dzialac). Pojawil sie tylko problem z targetem ktory sie nie kopiuje (dwa siatla maja wspolny target), podobny problem jest z kamerami. W tym wypadku trzeba uzyc polecenia CloneNodes tab = #() maxOps.CloneNodes selection[1] cloneType:#instance newNodes:&tab Wtedu w tablicy tab beda dwa elementy: target i swiatlo.
lechoo Napisano 8 Grudzień 2003 Autor Napisano 8 Grudzień 2003 Autor: VGTsXVII macroscript mesh_to_area_light category:\"Kurs maxscript\" tooltip:\"Area Light\" icon:#(\"Lights\",2) ( local kopia local i local pozycja grupa = getcurrentselection() obiekt = grupa[1] kopia = snapshotasmesh obiekt obiekt = omnilight name:\"Area_Light_01\" multiplier:0.1 castshadows:true obiekt.pos = (getvert kopia 1) for i = 2 to kopia.numverts do ( instance obiekt pozycja = (getvert kopia i) obiekt.pos = pozycja ) ) Krotko i skutecznie :D
lechoo Napisano 8 Grudzień 2003 Autor Napisano 8 Grudzień 2003 I jeszcze wszystkie skrypty: tematy05.zip Nastepny temat zamieszcze do piatku.
Sypo Napisano 9 Grudzień 2003 Napisano 9 Grudzień 2003 Ha, juz ja się zabiorę za zrozumienie tych świateł TargetDirect bo szykuje mi sie extra jeden dzień wolnego:D i dokończę swój skrypt. Dzięki lechoo za wszelka pomoc! Pozdrawiam wszystkich skryptowiczów [piwo] :)
leander Napisano 9 Grudzień 2003 Napisano 9 Grudzień 2003 Już pisałem lechoo, że fajny temat. Oby takich więcej. (co prawda nie wycisnąłem z niego wiele, ale jeszcze nic straconego)
Sypo Napisano 12 Grudzień 2003 Napisano 12 Grudzień 2003 Cześć :) Umieszczam poniżej dokończony już skrypt z tematem 5. Miałem kłopot ze zrozumieniem o co chodzi z tym clonenodes i tworzeniem tablic ale po długich dyskusjach zostałem olśniony:) Może się to przyda w którymś z kolejnych tematów zadań!Pozdrawiam:) global obiekt global trzecie for i = 1 to selection.count do ( obiekt = convertToMesh(selection) ) num_verts = obiekt.numverts pierwsze = omnilight pos:(getVert obiekt 1) for v = 2 to 4 do ( vert = getVert obiekt v drugie = instance pierwsze drugie.pos = vert ) trzecie = targetDirectionalLight pos:(getVert obiekt 5) target:(targetObject pos:[0,0,200]) for v = 6 to num_verts do ( tab = #() maxOps.CloneNodes trzecie cloneType:#instance newNodes:&tab vert = getVert obiekt v czwarte = trzecie czwarte.pos = vert )
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ę