Um man Plugins für 3D Studio Max zu schreiben, muss man nicht C++ kennen. Man kann das Plugin auch mit Maxskript schreiben. Hier habe ich einpaar einfache Beispiele :
I. Fläche II. Segmentierte Flфche III.Quader IV. Zilinder V. Sphere VI. Haus VII.Korone I. Fläche plugin simpleObject Flaeche name:"Flaeche" category:"CGR2" classID:#(0xe855567c, 0xbcd73b8b) ( parameters main rollout:params ( width type:#float ui:width default:1 hight type:#float ui:hight default:1 ) rollout params "Flaeche" ( spinner width "Width" range:[0,90,1] spinner hight "Hight" range:[0,90,1] ) on buildMesh do ( vert_array = #() face_array = #() v1 = [ 1*width , 1*hight , 0] v2 = [-1*width , 1*hight , 0] v3 = [ 1*width , -1*hight , 0] v4 = [-1*width , -1*hight , 0] append vert_array v1 append vert_array v2 append vert_array v3 append vert_array v4 append face_array [1,2,3] append face_array [3,2,4] setMesh mesh verts:vert_array faces:face_array ) tool create ( on mousePoint click do ( case click of ( 1: coordsys grid (nodeTM.translation = gridPoint) ) ) on mouseMove click do ( case click of ( 2: ((width = abs(gridDist.x)) (hight = abs(gridDist.y))) 3: (#stop) ) ) ) ) nach oben II. Segmentierte Fläche plugin simpleObject Flaeche name:"Flaeche" category:"CGR2" classID:#(0xe855567c, 0xbcd73b8b) ( parameters main rollout:params ( seg_width type:#integer ui:seg_width default:3 seg_hight type:#integer ui:seg_hight default:3 width type:#float ui:width default:1 hight type:#float ui:hight default:1 ) rollout params "Flфche" ( spinner seg_hight "seg_hight" range:[2,100,10] type:#integer spinner seg_width "seg_width" range:[2,100,10] type:#integer spinner width "Width" range:[-1000,1000,1] type:#float spinner hight "Hight" range:[-1000,1000,1] type:#float ) on buildMesh do ( vert_array = #() face_array = #() for i=0 to seg_width by 1 do ( for j=0 to seg_hight by 1 do ( v = [ (i*width)/seg_width, (j*hight)/seg_hight , 0 ] print v append vert_array v ) ) if (width > 0 and hight > 0) or (width < 0 and hight < 0) then ( for i=0 to seg_width-1 by 1 do ( for j=1 to seg_hight by 1 do ( append face_array [i*(seg_hight+1)+j, (i+1)*(seg_hight+1)+j, (i+1)*(seg_hight+1)+j+1] append face_array [i*(seg_hight+1)+j, (i+1)*(seg_hight+1)+j+1, i*(seg_hight+1)+j+1] ) ) ) else ( for i=0 to seg_width-1 by 1 do ( for j=1 to seg_hight by 1 do ( append face_array [i*(seg_hight+1)+j, i*(seg_hight+1)+j+1, (i+1)*(seg_hight+1)+j+1] ) ) ) setMesh mesh verts:vert_array faces:face_array ) tool create ( on mousePoint click do ( case click of ( 1: coordsys grid (nodeTM.translation = gridPoint) ) ) on mouseMove click do ( case click of ( 2: ( (width = gridDist.x) (hight = gridDist.y) ) 3: (#stop) ) ) ) ) nach oben II. Quader plugin simpleObject NewBox name:"Box" category:"CGR2" classID:#(0x4ef2985b, 0x5eda3ff0) ( parameters main rollout:params ( width type:#float ui:width default:1 hight type:#float ui:hight default:1 lenght type:#float ui:lenght default:1 ) rollout params "Flфche" ( spinner width "Width" range:[0,90,1] spinner hight "Hight" range:[0,90,1] spinner lenght "Lenght" range:[-90,90,1] ) on buildMesh do ( vert_array = #() face_array = #() v1 = [ 1*width , 1*hight , 0] v2 = [-1*width , 1*hight , 0] v3 = [ 1*width , -1*hight , 0] v4 = [-1*width , -1*hight , 0] v5 = [ 1*width , 1*hight , 1*lenght] v6 = [-1*width , 1*hight , 1*lenght] v7 = [ 1*width , -1*hight , 1*lenght] v8 = [-1*width , -1*hight , 1*lenght] append vert_array v1 append vert_array v2 append vert_array v3 append vert_array v4 append vert_array v5 append vert_array v6 append vert_array v7 append vert_array v8 if lenght > 0 then ( append face_array [2,1,3] append face_array [2,3,4] append face_array [3,7,4]-- append face_array [8,4,7]-- append face_array [7,3,1] append face_array [5,7,1] append face_array [5,6,8]-- append face_array [5,8,7]-- append face_array [2,5,6] append face_array [1,2,5] append face_array [4,8,6]-- append face_array [2,4,6]-- ) else ( append face_array [1,2,3] append face_array [3,2,4] append face_array [7,3,4]-- append face_array [4,8,7]-- append face_array [3,7,1] append face_array [7,5,1] append face_array [6,5,8]-- append face_array [8,5,7]-- append face_array [5,2,6] append face_array [2,1,5] append face_array [8,4,6]-- append face_array [4,2,6]-- ) setMesh mesh verts:vert_array faces:face_array ) tool create ( on mousePoint click do ( case click of ( 1: coordsys grid (nodeTM.translation = gridPoint) ) ) on mouseMove click do ( case click of ( 2: ((width = abs(gridDist.x)) (hight = abs(gridDist.y))) 3: ( lenght = gridDist.z ) 4: (#stop) ) ) ) ) nach oben IV. Zilinder plugin simpleObject Zilinder name:"Zilinder" category:"CGR2" classID:#(0xeb2ad4f, 0x190a419f) ( parameters main rollout:params ( segments type:#integer ui:segments default:5 radius type:#float ui:radius default:1.0 height type:#float ui:height default:1.0 ) rollout params "Zilinder" ( spinner segments "Segments " range:[2,500,10] type:#integer spinner height "height " range:[-100,100,0] type:#float spinner radius "Radius " range:[0,100,0] type:#float ) on buildMesh do ( segm = segments + 1 vert_array = #() face_array = #() for i=0 to 1 by 1 do( append vert_array [0, i*height , 0] for j=0 to segments by 1 do( winkel = (j * (360.01 / segments) ) vx = cos(winkel) * radius vy = i*height vz = sin(winkel) * radius append vert_array [vx, vy, vz] ) ) if height > 0 then ( for i=1 to segments by 1 do( append face_array[1,i+1,i+2 ] ) for i=1 to segments by 1 do( append face_array[i+1, i+segments+3, i+2 ] append face_array[i+2, i+segments+3, i+segments+4 ] ) for i=1 to segments by 1 do( append face_array[segments + i + 3, segments + 3 , segments + i + 4 ] ) ) else ( for i=1 to segments by 1 do( append face_array[i+1,1,i+2 ] ) for i=1 to segments by 1 do( append face_array[i+segments+3, i+1, i+2 ] append face_array[i+segments+3, i+2, i+segments+4 ] ) for i=1 to segments by 1 do( append face_array[segments + 3, segments + i + 3 , segments + i + 4 ] ) ) setMesh mesh verts:vert_array faces:face_array ) tool create ( on mousePoint click do ( case click of ( 1: coordsys grid (nodeTM.translation = gridPoint) ) ) on mouseMove click do ( case click of ( 2: (radius = gridDist.x) 3: (height = gridDist.y) 4: (#stop) ) ) ) ) nach oben V. Sphere plugin simpleObject Bal name:"Bal" category:"CGR2" classID:#(0xeb2ad4f, 0x190a419f) ( parameters main rollout:params ( segments type:#integer ui:segments default:5 radius type:#float ui:radius default:1 rings type:#integer ui:rings default:4 ) rollout params "Ball" ( spinner segments "Segments " range:[3,500,10] type:#integer spinner rings "Rings " range:[3,10000,0] type:#integer spinner radius "Radius " range:[0,10000,0] type:#float ) on buildMesh do ( segm = segments + 1 if segm > 2 then ( vert_array = #() face_array = #() anzahlPunkte = segments * rings for i=0 to rings - 1 by 1 do( ringRadius = sin(i * 180 / (rings - 1)) * radius ringY =cos(i * 180 / (rings - 1)) * radius for j=0 to segm - 1 by 1 do( winkel = (j * 360) / (segm - 1) vx =cos(winkel) * ringRadius vy = ringY vz = sin(winkel) * ringRadius append vert_array [vx, vy, vz] ) ) for i=1 to rings-1 by 1 do( ring = 0 seg = 0 for j=1 to segm - 1 by 1 do( if i == rings - 1 then ( ring = 0 ) else ( ring = i ) if j == segm then ( seg = 0 ) else ( seg = j ) append face_array[ ring*segm+seg,(ring+1)*segm+seg+1, (ring+1)*segm+seg] append face_array[ ring*segm+seg,ring*segm+seg+1,(ring+1)*segm+seg+1] ) ) for i=0 to rings by 1 do( for j=0 to segments by 1 do( ring = 0 if i == rings - 1 then ( ring = 0 ) else ( ring = i ) seg = 0 if j == segments - 1 then ( seg = 0 ) else ( seg = j ) ) ) ) setMesh mesh verts:vert_array faces:face_array ) tool create ( on mousePoint click do ( case click of ( 1: coordsys grid (nodeTM.translation = gridPoint) ) ) on mouseMove click do ( case click of ( 2: (radius = abs(gridDist.x)) 3: (#stop) ) ) ) ) nach oben VI. Haus plugin simpleObject Hasus name:"Haus" category:"CGR2" classID:#(0x3e2cb992, 0x65416766) ( parameters main rollout:params ( width type:#float ui:width default:1 hight type:#float ui:hight default:1 lenght type:#float ui:lenght default:1 dach type:#float ui:dach default:1 ) rollout params "Haus" ( spinner width "Width" range:[0,90,1] spinner hight "Hight" range:[0,90,1] spinner lenght "Lenght " range:[0,90,1] spinner dach "Dach " range:[0,90,1] ) on buildMesh do ( vert_array = #() face_array = #() v1 = [ 1*width, 1*hight, -1*lenght] v2 = [-1*width, 1*hight, -1*lenght] v3 = [-1*width, 1*hight, 1*lenght] v4 = [ 1*width, 1*hight, 1*lenght] v5 = [ 1*width, -1*hight, -1*lenght] v6 = [-1*width, -1*hight, -1*lenght] v7 = [-1*width, -1*hight, 1*lenght] v8 = [ 1*width, -1*hight, 1*lenght] v9 = [ 0, 0 , 2*lenght] append vert_array v1 append vert_array v2 append vert_array v3 append vert_array v4 append vert_array v5 append vert_array v6 append vert_array v7 append vert_array v8 append vert_array v9 append face_array [1,2,3] append face_array [3,4,1] append face_array [1,2,6] append face_array [1,6,5] append face_array [1,4,5] append face_array [5,4,8] append face_array [3,6,2]-- append face_array [3,7,6]-- append face_array [6,5,7] append face_array [7,5,8] append face_array [7,4,3] append face_array [8,4,7] --dach append face_array [1,2,9] append face_array [2,3,9] append face_array [3,4,9] append face_array [4,1,9] setMesh mesh verts:vert_array faces:face_array ) tool create ( on mousePoint click do ( case click of ( 1: coordsys grid (nodeTM.translation = gridPoint) ) ) on mouseMove click do ( case click of ( 2: (width = abs(gridDist.x)) 3: (hight = abs(gridDist.y)) 4: (lenght = abs(gridDist.z)) 5: (#stop) ) ) ) ) nach oben VII. Korone plugin simpleObject Bal name:"Korone" category:"CGR2" classID:#(0xeb2ad4f, 0x190a419f) ( parameters main rollout:params ( segments type:#integer ui:segments default:5 radius type:#float ui:radius default:1 rings type:#integer ui:rings default:4 ) rollout params "Haus" ( spinner segments "Segments " range:[2,500,10] type:#integer spinner rings "Rings " range:[0,10000,0] type:#integer spinner radius "Radius " range:[0,10000,0] type:#float ) on buildMesh do ( vert_array = #() face_array = #() anzahlPunkte = segments * rings for i=0 to rings - 1 by 1 do( ringRadius = sin(i * 180 / (rings - 1)) * radius ringY =cos(i * 180 / (rings - 1)) * radius for j=0 to segments - 1 by 1 do( winkel = (j * 360) / (segments - 1) vx =cos(winkel) * ringRadius vy = ringY vz = sin(winkel) * ringRadius append vert_array [vx, vy, vz] ) ) for i=0 to segments - 1 by 1 do( if i == segments - 1 then ( seg = segments+1 ) else ( seg = segments+i+2 ) ) for i=1 to 1 by 1 do( ring = 0 seg = 0 for j=1 to segments - 1 by 1 do( print i print j if i == rings - 1 then ( ring = 0 ) else ( ring = i ) if j == segments then ( seg = 0 ) else ( seg = j ) append face_array[ ring*segments+seg,(ring+1)*segments+seg,(ring+1)*segments+seg+1] ) ) for i=0 to rings by 1 do( for j=0 to segments by 1 do( ring = 0 if i == rings - 1 then ( ring = 0 ) else ( ring = i ) seg = 0 if j == segments - 1 then ( seg = 0 ) else ( seg = j ) ) ) setMesh mesh verts:vert_array faces:face_array ) tool create ( on mousePoint click do ( case click of ( 1: coordsys grid (nodeTM.translation = gridPoint) ) ) on mouseMove click do ( case click of ( 2: (radius = abs(gridDist.x)) 3: (#stop) ) ) ) )