Archiv der Kategorie: MaxScript

kleine Helferlein für 3ds max

Vertices von Objekte in Selektion nacheinander welden

Mit dem folgenden maxscript lassen sich Vertices von selektierten Objekten nacheinander verschweiße. Kann praktisch sein wenn es sich um sehr viele Objekte handelt und Max bei einem einzelnen Durchgang einzufrieren drohen würde.

Der Print- Befehl im Script zeigt im Listener den Fortschritt an. Damit während des Prozesses Max nicht aufhört zu reagieren wird alle 5 Sekunden der Bildschirm refresht.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
clearlistener()
 
sel = selection
startID = timeStamp()
for i = 1 to sel.count do (
    ConvertTo sel[i] Editable_Poly
    sel[i].weldThreshold = 0.001
    allVerts = #{1..(polyop.getNumVerts sel[i])}
    polyop.weldVertsByThreshold sel[i] allVerts
    print (i as string + " from " + sel.count as string + " welded...")
    stampID = timeStamp()
    if (((stampID - startID) / 1000.0) >= 5.00) do (
        startID = timeStamp()
        windows.processPostedMessages()
        )
    )

Lichtquelle, anhand des Glanzpunktes auf einem Objekt, erstellen

Heute gibt es nur einen Link… Hatte mir die Tage Gedanken drüber gemacht ob man per Script die Position einer Lichtquelle, anhand des gewünschten Glanzpunktes, erstellen lassen kann. Und siehe da, das Script gibt es schon und funktioniert super! Besser als ich es hin bekommen hätte.

http://www.scriptspot.com/bobo/mxs2008/LightTouch

MaxScript Cube Shatter

Voronoi shatter gibt es einige, möchte man jedoch sein Objekt in Würfel zerlegen wird es schon etwas dünner mit dem Angebot. Hier ein Art, wie man das ganze mit maxscript umsetzten kann (GUI wird noch folgen):

CubeShatter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
orgObj = selection[1]
 
-- process slices
fn process orgObj = (
	if (orgObj != undefined) then (
 
		-- copy original for processing, set pivot and reset all transformations
		obj = copy orgObj
		obj.pivot = obj.center
		obj.pivot.z = obj.min.z
		resetXForm obj
		convertToMesh obj
		objDim = obj.max - obj.min
 
		-- size of the quad pieces in scene units
		PlaneDistance = 8
 
		-- calculate how many cuts in every dimension
		planeCountX = (objDim.x / PlaneDistance) as integer
		planeCountY = (objDim.y / PlaneDistance) as integer
		planeCountZ = (objDim.z / PlaneDistance) as integer
 
		--check if count come to the "soft" limit
		sum = planeCountX * planeCountY * planeCountZ
		if ( sum > 4000) do (
			if queryBox ("Warning: You want to cut \"" + sum as string + "\" pieces. Are you sure that you want to continue?") then (
 
			) else (
				delete obj
				return false
				)
		) 	
 
		--set the cut plane matrixes
		planeSumX = for x = 1 to planeCountX - 1 collect (matrix3 [0,0,-1] [0,1,0] [1,0,0] [(objDim.x / planeCountX * x + obj.min.x - obj.pos.x), (obj.max.y + obj.min.y) / 2, (obj.max.z + obj.min.z) / 2])
		planeSumY = for y = 1 to planeCountY - 1 collect (matrix3 [1,0,0] [0,0,1] [0,-1,0] [(obj.max.x + obj.min.x) / 2, (objDim.y / planeCountY * y + obj.min.y - obj.pos.y), (obj.max.z + obj.min.z) / 2])
		planeSumZ = for z = 1 to planeCountZ - 1 collect (matrix3 [0,1,0] [-1,0,0] [0,0,1] [(obj.max.x + obj.min.x) / 2, (obj.max.y + obj.min.y) / 2, (objDim.z / planeCountZ * z + obj.min.z - obj.pos.z)])
 
		-- cut object in the x direction
		objArray1 = #()	
		for a = 1 to planeSumX.count do (
			ob1 = copy obj
			addModifier ob1 (sliceModifier name:"cutPlane1" slice_type:2)
			ob1.cutPlane1.slice_plane.transform = planeSumX[a]
			addModifier ob1 (sliceModifier name:"cutPlane2" slice_type:3)
			if (a-1 > 0) do (ob1.cutPlane2.slice_plane.transform = planeSumX[a-1])
			addModifier ob1 (cap_holes())
			convertToMesh ob1
			join objArray1 #(ob1)
			)
		addModifier obj (sliceModifier name:"cutPlane3" slice_type:3)
		obj.cutPlane3.slice_plane.transform = planeSumX[planeSumX.count]
		addModifier obj (cap_holes())
		convertToMesh obj
		join objArray1 #(obj)
 
		-- cut objects in y direction
		objArray2 = #()		
		for b = 1 to objArray1.count do (
			for c = 1 to planeSumY.count do (
				ob2 = copy objArray1[b]
				addModifier ob2 (sliceModifier name:"cutPlane1" slice_type:3)
				if (c+1 <= planeSumY.count) do (ob2.cutPlane1.slice_plane.transform = planeSumY[c+1])
				addModifier ob2 (sliceModifier name:"cutPlane2" slice_type:2)
				ob2.cutPlane2.slice_plane.transform = planeSumY[c]
				addModifier ob2 (cap_holes())
				convertToMesh ob2
				join objArray2 #(ob2)
				)
			addModifier objArray1[b] (sliceModifier name:"cutPlane3" slice_type:3)
			objArray1[b].cutPlane3.slice_plane.transform = planeSumY[1]
			addModifier objArray1[b] (cap_holes())
			convertToMesh objArray1[b]
			join objArray2 #(objArray1[b])
			)	
 
		-- cut objects in y direction
		--objArray3 = #()		
		for i = 1 to objArray2.count do (
			for j = 1 to planeSumZ.count do (
				ob3 = copy objArray2[i]
				addModifier ob3 (sliceModifier name:"cutPlane1" slice_type:2)
				ob3.cutPlane1.slice_plane.transform = planeSumZ[j]
				addModifier ob3 (sliceModifier name:"cutPlane2" slice_type:3)
				if (j-1 > 0) do (ob3.cutPlane2.slice_plane.transform = planeSumZ[j-1])
				addModifier ob3 (cap_holes())
				convertToMesh ob3
				ob3.pivot = ob3.center
				--join objArray3 #(ob3)
				)
				addModifier objArray2[i] (sliceModifier name:"cutPlane3" slice_type:3)
				objArray2[i].cutPlane3.slice_plane.transform = planeSumZ[planeSumZ.count]
				addModifier objArray2[i] (cap_holes())
				convertToMesh objArray2[i]
				objArray2[i].pivot = objArray2[i].center
				--join objArray3 #(objArray2[i])
			)
 
		-- clear variables and clean script cache
		objArray1 = #()
		objArray2 = #()
		--objArray3 = #()
		enableSceneRedraw()
		CompleteRedraw()
		gc()
		) else (
			messageBox "Please select one object first!"
			)
	) -- fn end
 
process orgObj

Im Script die Länge der Würfelseite angeben (PlaneDistance), Objekt auswählen und Script ausführen.

Visual Studio 2010 Express für das Kompilieren von 3Ds Max Plugins einrichten

Ersteinmal laden wir die nötigen Installationen herunter:

 

Visual Studio C++ 2010 Express können wir ohne Silverlight und SQL Server installieren. Vom Windows SDK brauchen wir mindestens:

  • Samples
  • Windows Headers and Libraries
  • Visual C++ Compilers
  • Redistributable Packages: Microsoft Visual C++ 2010

sdk

Bricht die Installation vorzeitig ab, müssen schon installierte Microsoft Visual c++ Redistributable Packages deinstalliert werden, und zwar alle 2010er. Wenn alles installiert ist können diese später wieder installiert werden:

http://www.microsoft.com/de-de/download/confirmation.aspx?id=14632

Wenn das 3Ds Max SDK noch nicht installiert wurde, ist das als nächstes dran. Um schnell drauf navigieren zu können habe ich als Pfad: „C:\Autodesk\3Ds Max 2014 SDK“ gewählt (Versionsnummer entsprechend der 3Ds Max Version).

Als nächstes öffnen wir mit einem Texteditor die Datei:

C:\Autodesk\3ds Max 2014 SDK\maxsdk\howto\3dsmaxPluginWizard\3dsmaxPluginWizard.vsz

und tragen dort den vollen Pfad vom 3Ds Max SDK ein:

Param=“ABSOLUTE_PATH = C:\Autodesk\3ds Max 2014 SDK\maxsdk\howto\3dsmaxPluginWizard“

Im Anschluss, nach dem Speichern der veränderten Datei, kopieren wir im gleichen Ordner die Dateien:

  • 3dsmaxPluginWizard.ico
  • 3dsmaxPluginWizard.vsdir
  • 3dsmaxPluginWizard.vsz

nach: „C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\Express\VCProjects“

Als letztes müssen nur noch einige Pfade in Visual Studio C++ Express eingefügt werden. Wenn ich richtig informiert bin, funktioniert das Kompilieren im Debug Modus für die Plugin Beispiele nicht, daher werden wir nur Pfade für Release / Hybrid anpassen. Der Einfachheit halber tue ich das hier nur für Hybrid x64. Wer möchte kann das erweitern für Release und 32 Bit, die Schritte bleiben gleich, bis auf die Kompiler- und Lib- Pfade für 32 Bit.

 

Bevor wir uns gleich an Visual Studio ran machen, fügen wir noch zwei Umgebungsvariablen ein. Und Zwar unter: Systemsteuerung / System / Erweiterte Systemeinstellungen / Erweitert / Umgebungsvariablen

Hier kann man nun sich aussuchen ob man die Variable als Systemvariable, also global, oder als Benutzervariable vergeben möchte. Ich habe sie als Benutzervariale vergeben. Dort unter Path tragen wir nun folgende Variablen ein:

  • C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\
  • C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE

Getrennt jeweils mit einem ;

variable

 

Öffnen wir als nächstes Visual Studio C++ 2010 Express

Unter Extras/Einstellungen aktivieren wir „Erweiterte Einstellungen“

erweiterteEnstellungen

Nun öffnen wir ein beliebiges Projekt, in meinem Fall nehme ich:

C:\Autodesk\3ds Max 2014 SDK\maxsdk\howto\mentalray\mrGeomShaderObject\mrGeomShaderObject.vcxproj

Unter Ansicht wählen wir nun den Eigenschaften Manager aus.

EigenschaftenManager

Mit einem Doppelklick auf den Ordner Hybrid | x64 öffnet sich das Eigenschaftenseiten Fenster.

Hybird

In der linken Spalte wählen wir VC++ Verzeichnisse aus und als nächstes passen wir auf der rechten Seite die Pfade für Includeverzeichnisse und Bibliotheksverzeichnisse an.

Öffnen wir zunächst die Includeverzeichnisse und dort können wir, wenn wir auf das Ordnersymbol klicken einen neuen Ordner hinzufügen. Hier wählen wir den Ordner:

„C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\winui\tsf\tsfcompart“ aus.

include

Gleiches machen wir auch für die Bibliotheksverzeichnisse und fügen dort:

„C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64“ ein.

Zu guter Letzt klappen wir links noch Linker auf und stellen dort unter Manifestdatei: Manifest generieren auf Nein.

manifest

Mit Übernehmen und OK können wir jetzt das Eigenschaftenseiten Fenster schließen.

Jetzt können wir schon im oberen dropdown Menü Hybrid und x64 wählen und mit dem kleinen grünen Pfeil unser erstes Plugin kompilieren :).

compile