Zawartość dodana przez lechoo
-
lokalny uklad odniesienia
in coordsys obiekt_matka ( obiekt_dziecko.pos = [x,y,z] ) x,y,z to wartosci ustawiane suwakami
-
Pytania 3dsmaxmana - MaxScript :)
Zmodyfikuj ten kawalek kodu: case click of ( 2: (a = abs(gridDist.x)) 3: ( addmodifier selection[1] (Smooth autosmooth:true threshold:30) #stop ) ) Podejrzewam ze moznaby zrobic to bardziej elegancko ale to bylo najprostsze rozwiazanie.
-
Pytania 3dsmaxmana - MaxScript :)
W funkcji buildMesh musisz zmienic wszystkie ost na mesh. Jest to lokalna zmienna na ktorej operuje skryptowy plugin, czyli obiekt ktory tworzy. Wyrzuc tez addmodifier i convertToMesh. Drugie jest niepotrzebne a nadawanie modyfikatora w funkcji buildMesh oznaczaloby nakladanie nowego modyfikatora za kazdym razem kiedy zmieniasz jakis parametr obiektu, bo wlasnie tak wywolywana jest funkcja buildMesh. Sama funkcja setMesh sluzy to zdefiniowania topologi jakiegos juz istniejacego mesha (to ze mesh istnieje nie oznacza ze na zdefiniowana topologie), natomiast Ty uzywales setMesh na zmiennej ost pod ktora nie bylo zadnego mesha i dlatego wywalalo Ci blad. W normalnym skrypcie musialbys najpierw napisac ost = mesh() i dopiero wtedu setMesh.
-
Pytania 3dsmaxmana - MaxScript :)
Moglbys wrzucic caly skrypt, tak najlatwiej bedzie znalesc jakis blad.
-
Pytania 3dsmaxmana - MaxScript :)
Myslalem ze chodzi C o sam modyfikator :) Najprawodpodobniej nie zadeklarowales zmiennej ost, przynajmniej ja mam identyczny blad w takiej sytuacji. Sprobuj zmienic sam poczatek skryptu na: plugin simpleObject OstFor name: "OstFor" category: "Own Geometric Objects" classID:#(0x61e203b2, 0x63656b19) ( local ost a dalej po staremu.
-
Pytania 3dsmaxmana - MaxScript :)
Wywolanie jest jak najbardziej poprawne. Co do podstawowych bryl mozesz poszukac w przykladowych pluginach do maxa ktore sa w sdk. Sama geometrie tworzy sie dosc podobnie. Mozesz tez sprobowac na www.scriptspot.com w dziale objects.
-
lokalny uklad odniesienia
Mozesz wykorzystac konstrukcje in coordsys. Przykladowo: in coordsys glowa_obj ( --tutaj poruszasz miesniami i wszystkie opercje beda sie odbywaly w --lokalnym ukladzie wspolrzednych obiektu glowa_obj )
-
if select OBJ ?
Normalnie robi sie to na callbackach ale nie znalazlem takiego ktory bylby wywolywany w momencie zaznaczenia obiektu. Byc moze da sie to jakos obejsc wykorzystujac custom attributes np. wywolujac jakas funkcje w momencie otwarcia interfejsu dodanego do obiektu.
-
tablica wierzchołków, ścianek i mesh w MaxScript
How To ... Read Geometry Data From Text File - Part One & Two
-
Plug-iny w C++, a skrpty
1. Jesli poprostu chcesz pisac w maxie to proponuje zaczac od skryptow. Do wielu rzeczy nie warto pisac pluginow bo w skrypcie jest prosciej i szybciej. Natomiast jesli masz pomysl na jakies konkretne narzedzie to warto zastanwic sie nad pluginem. 2. Jest ksiazka "mastering max script & max sdk" jesli dobrze pamietam tytul i to w zasadzie wszystko (i tak lepiej niz do XSI bo tam nic nie ma). Pozostaje wiec help i przyklady z samego sdk.
-
if select OBJ ?
Nie bardzo rozumiem co chcialbys zrobic. Blad wywala Ci bo kontroler skryptowy musi zwracac wartosc Point3 czyli np. if (select $Box01)==1 then [0,0,0] else [0,0,0] powinno byc dobrze.
-
fn custAttributes - przekazywanie zmiennej
Dobrym pomyslem byloby zamienic getnodeByName na getNodeByHandle. Nigdy nie bedziesz mial dwoch nodow o tym samym ID a z nazwami moze byc roznie.
-
fn custAttributes - przekazywanie zmiennej
Musisz dodac do custom attributes parametr myID type:#integer i wpisac do niego ID obiektu na ktorym jest CA: $Box01.inode.handle. Teraz pod samym buttonem odzyskujesz obiekt po jego ID: myObj = maxOps.getNodeByHandle myID. Jak masz obiekt reszta jest prosta: myObj.parent - rodzic obiektu myObj.children - tablica z dziecmi obiektu
-
fn custAttributes - przekazywanie zmiennej
Czy funkcja pod buttonem ma dzialac na obiektach bedacych dziecmi lub rodzicami obiektu do ktorego button jest przypisany?
-
fn custAttributes - przekazywanie zmiennej
Problem jest taki ze kazesz custom atrybutowi wypisac zmienna lokalna wazna tylko w obrebie funkcji boneCA, a tego nie mozna zrobic (a jest domyslne zmienna globalna). Musisz dodac do CA jakiegos stringa np. myObjName, do niego wpisac swoja zmienna czyli nameObj i wypisywac ta wewnetrzna zmienna. fn boneCA target nameObj = ( anotherObjNameCA = attributes attribute( parameters main rollout:params( blend type:#float ui:sld default:50 myObjName type:#string ) rollout params "IK/FK Blending" ( button btnSik "IK" pos:[10,51] width:31 height:22 button btnSfk "FK" pos:[119,53] width:31 height:22 label lbl1 "" pos:[57,56] width:52 height:17 slider sld "" pos:[5,12] width:152 height:25 button btnDik "IK" pos:[12,86] width:31 height:22 button btnDfk "FK" pos:[121,88] width:31 height:22 label lbl2 "" pos:[51,86] width:61 height:17 on btnSik pressed do ( print myObjName ) on btnSfk pressed do(print a) )) cn = getnodebyname target; custAttributes.add cn anotherObjNameCA cn.myObjName = nameObj ) a = "nic"; boneCA $Box01.name "jakas nazwa" Co do pytania 2 to chyba nie ale jeszcze pomysle :)
-
Quat Values * lub /
Ja jak chce wiedziec co sie dzieje konwertuje kwaterniony na eulerangles, pracuje na nich i na koniec konwertuje zpowrotem na kwaterniony.
-
Quat Values * lub /
Z kwaternionami bedzie troche inaczej, dzielisz tylko angle: dependsOn $Box01 myVal = $Box01.rotation myVal.angle = myVal.angle / 2 inverse myVal
-
zapisanie zmiennych
Sorki, napisalem to w ciemno bez sprawdzania, powinno byc tak: anotherObjNameCA = attributes "anotherObjName" ( parameters mainParams ( myObj type:#string ) ) custAttributes.add $GeoSphere01 anotherObjNameCA
-
Quat Values * lub /
hehe, najprosciej napisac i zobaczyc czy wywali blad, ale powarznie to mozna dzielic calosc, to samo z pozycja.
-
zapisanie zmiennych
Stringa dodajesz tak: anotherObjNameCA = attributes anotherObjName ( parameters main rollout:params ( myObj type:#string ) ) custAttributes.add $GeoSphere01 anotherObjNameCA A reszta juz tak samo.
-
zapisanie zmiennych
Mozesz to zrobic przy pomocy custom attributes np. tak: anotherObjNameCA = attributes anotherObjName ( parameters main rollout:params ( myObj type:#node ) rollout params "another object" ( pickButton myObjpicker "pick object" on myObjpicker picked obj do myObj = obj ) ) custAttributes.add $GeoSphere01 anotherObjNameCA Wykoanie tego kodu spowoduje dodanie do GeoSphere01 atrybutu myObj ktory bedzie mogl przechowywac obiekty. Pickbutton sluzy tylko do wpisania czegos do tej zmiennej. Teraz mozesz dobrac sie do tego obiektu w ten sposob: print $GeoSphere01.myObj.name Spowoduje to wypisanie nazwy obiektu przechowywanego w GeoSphere01. Jesli nie potrzebujesz pickbuttona to mozesz pominac cala czesc z rolloutem i wpisac obiekt samemu $GeoSphere01.myObj = $jakis_obiekt Oczywiscie custom attributes sa zapisywane razem ze scena. Mama nadzieje ze o to Ci chodzilo.
-
Klik i model
O ile wiem nie mozna zaimportowac tylko czesci obiektow z jakiegos pliku, ale mozna zrobic merge wybranych obiektow z pliku max.
-
Klik i model
Na przyklad tak: utility test01 "test" ( button imgTest images:#("c:/temp/pic.bmp",undefined,1,1,1,1,1) on imgTest pressed do importFile "c:/temp/box.3ds" ) Wystarczy ze pozmieniasz odpowiednie sciezki i zrobisz guzik i bitmape dla kazdego obiektu.
-
Klik i model
Jesli chcesz je udostepnic to najprosciej przekonwertowac do formatu czytanego przez maxa. Jesli koniecznie chcesz robic to pluginem to musisz z poziomu kodu tworzyc cala geometrie od zera. Nie polecam tej metody, bo plik ze zrodlem moze zrobic sie strasznie duzy jesli modele sa skomplikowane i jest ich duzo. W helpie do max scriptu zerknij do rozdzialu "Scripted SimpleObject Plug-ins", tam jest pokazane jak robi sie takie rzeczy. Mozesz to zrobic jeszcze inaczej, nacisniecie konkretnej miniaturki powoduje zaimportowanie pliku z tym modelem, wydaje mi sie ze tak byloby najprosciej.
-
Bugi w max skrypcie
Wlasciwie jest to brak w VRay'u. Jego swiatla "VRayLight" nie maja udostepnionj dla max scriptu wlasciwosci excludeList.