Skocz do zawartości

Kurs MAX Script - temat 5 - podsumowanie


Rekomendowane odpowiedzi

Napisano

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.

  • Odpowiedzi 9
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Top Posters In This Topic

Napisano

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.

Napisano

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.

Napisano

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.

Napisano

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.

Napisano

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

Napisano

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] :)

Napisano

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

)

 

 

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