3d Studio Max Plugins

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