Zobacz pełną wersję : Pytania 3dsmaxmana - MaxScript :)



3dsmaxman
10-03-05, 17:25
oto pierwsze pytanie - czy ktos wie, gdzie moge znalesc skrypty/pluginy podstawowych bryl geometrycznych? bo np. proubuje zrobic plugin tworzacy graniastoslup foremny o podstawie kwadratu i co? jak zwykle mam problemy :P z tworzeniem siatki - w helpie "How To - Scripted Geometry Plugin" (czy cos takiego) bylo opisane jak stworzyc jeden plugin; wzorujac sie na nim chcialem stworzyc moj plugin; do tworzenie siatki uzywalem funkcji 'setMesh'; jak potem moc np. dodawac modyfikator do takiej siatki? gdzie w wywolaniu funkcji mam podana nazwe? bo mi, jak potem probowalem ustawic automatycznym sposobem smoothgroups, to nie chcial :/

setMesh ost verts:vert_array faces:face_array
addmodifier ost (Smooth autosmooth:true threshold:30)

czy to jest poprawne wywolanie? :P

lechoo
10-03-05, 18:29
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 (http://www.scriptspot.com) w dziale objects.

3dsmaxman
10-03-05, 19:21
obie linijki? bo ja mam taki skrypt (pomijam interfejs itp. - sam glowny kod:

plugin simpleObject OstFor
name: "OstFor"
category: "Own Geometric Objects"
classID:#(0x61e203b2, 0x63656b19)
(
...
on buildMesh do
(
vert_array = #()
face_array = #()
tmp = (a * sqrt(2) / 2)
tmp *= tmp
tmp2 = a * a - tmp
h = sqrt(tmp2)
v1 = [-a/2,-a/2,0]
v2 = [a/2,-a/2,0]
v3 = [a/2,a/2,0]
v4 = [-a/2,a/2,0]
v5 = [0,0,h]
append vert_array v1
append vert_array v2
append vert_array v3
append vert_array v4
append vert_array v5
append face_array [1,4,3]
append face_array [3,2,1]
append face_array [1,2,5]
append face_array [2,3,5]
append face_array [3,4,5]
append face_array [4,1,5]
setMesh ost verts:vert_array faces:face_array
addmodifier ost (Smooth autosmooth:true threshold:30)
convertToMesh(ost)

for i = 1 to 2 do
(
setEdgeVis ost i 1 false
setEdgeVis ost i 2 true
setEdgeVis ost i 3 true
)
for i = 3 to 6 do
(
setEdgeVis ost i 1 true
setEdgeVis ost i 2 true
setEdgeVis ost i 3 true
)
update ost
)
...
)--end create
)--end plugin

i przy brobie stworzenia po raz pierwszy obiektu uzywajac myszki wyskakuje taki oto blad:
http://img49.exs.cx/img49/9211/bladmaxa5fm.jpg
co wiec trzeba z tym zrobic?

lechoo
10-03-05, 20:05
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.

3dsmaxman
10-03-05, 21:08
nadal jest jakis blad;

-- Error occurred in buildMesh()
-- Frame:
-- tmp: 0.5
-- v5: [0,0,0.707107]
-- tmp2: 0.5
-- face_array: #([1,4,3], [3,2,1], [1,2,5], [2,3,5], [3,4,5], [4,1,5])
-- v3: [0.5,0.5,0]
-- v4: [-0.5,0.5,0]
-- v1: [-0.5,-0.5,0]
-- v2: [0.5,-0.5,0]
-- vert_array: #([-0.5,-0.5,0], [0.5,-0.5,0], [0.5,0.5,0], [-0.5,0.5,0], [0,0,0.707107])
-- h: 0.707107
>> MAXScript Scripted Plugin Handler Exception: -- No ""setMesh"" function for undefined <<


dochodze do wniosku, ze pokpilem cos chyba we fragmencie, gdzie uzytkownik poprzez szuranie myszka wzdluz osi X okresla dlugosc boku :)

tool create
(
on mousePoint click do
(
case click of
(
1: coordsys grid (nodeTM.translation = gridPoint)
)
)
on mouseMove click do
(
case click of
(
2: (a = abs(gridDist.x))
3: (#stop)
)
)
)--end create

bowiem blad wyskakuje, gdy tylko klikne myszka w aktywnym oknie, a nie dobiero gdy przeciagne kursorem i puszcze

lechoo
11-03-05, 06:58
Moglbys wrzucic caly skrypt, tak najlatwiej bedzie znalesc jakis blad.

3dsmaxman
11-03-05, 14:05
plugin simpleObject OstFor
name: "OstFor"
category: "Own Geometric Objects"
classID:#(0x61e203b2, 0x63656b19)
(
parameters main rollout: params
(
a type:#integer ui:a default:1
)
rollout params "Object Settings"
(
spinner a "Edge Length" range:[1,10,1] type:#integer
)
on buildMesh do
(
vert_array = #()
face_array = #()
tmp = (a * sqrt(2) / 2)
tmp *= tmp
tmp2 = a * a - tmp
h = sqrt(tmp2)
v1 = [-a/2,-a/2,0]
v2 = [a/2,-a/2,0]
v3 = [a/2,a/2,0]
v4 = [-a/2,a/2,0]
v5 = [0,0,h]
append vert_array v1
append vert_array v2
append vert_array v3
append vert_array v4
append vert_array v5
append face_array [1,4,3]
append face_array [3,2,1]
append face_array [1,2,5]
append face_array [2,3,5]
append face_array [3,4,5]
append face_array [4,1,5]
setMesh ost verts:vert_array faces:face_array
addmodifier ost (Smooth autosmooth:true threshold:30)
convertToMesh(ost)

for i = 1 to 2 do
(
setEdgeVis ost i 1 false
setEdgeVis ost i 2 true
setEdgeVis ost i 3 true
)
for i = 3 to 6 do
(
setEdgeVis ost i 1 true
setEdgeVis ost i 2 true
setEdgeVis ost i 3 true
)
update ost
)
tool create
(
on mousePoint click do
(
case click of
(
1: coordsys grid (nodeTM.translation = gridPoint)
)
)
on mouseMove click do
(
case click of
(
2: (a = abs(gridDist.x))
3: (#stop)
)
)
)--end create
)--end plugin

lechoo
11-03-05, 17:51
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.

3dsmaxman
11-03-05, 20:21
jednak jesli nie zdefiniuje grup wygladzania, to owszem - skrypt dziala bez zarzutu, ale efekt nie jest dosc dobry...
wkleisz tu fragment skryptu, w ktory nalezy wcisnac ta instrukcje?

http://img210.exs.cx/img210/1764/fotka7dx.jpg

lechoo
14-03-05, 17:45
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.

3dsmaxman
14-03-05, 19:17
dziekuje i skacze z radosci! :)
moj pierwszy plug-in dziala (prymitywny, ale co?)! :P