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.
Archiv der Kategorie: 3D
Erst mal nur 3Ds Max…
Cubic Shatter
Im vorherigen Beitrag habe ich ein Script veröffentlicht mit dem man Objekte in Würfel zerlegen kann.
Hier kommt nun das überarbeite Script mit grafischer Oberfläche:
Download: https://github.com/jb-alvarado/CubicShatter/archive/master.zip
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):
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:
- 1. Visual Studio C++ 2010 Express
http://www.computerbase.de/downloads/system/entwicklung-und-server/visual-studio-2010/36259/
(Achtung: Nach der Installation von dem ISO File muss noch ein Update installiert werden: http://www.microsoft.com/de-de/download/details.aspx?id=23691 ) - 2. Windows SDK for Windows 7 and .Net Framework 4
http://www.microsoft.com/en-us/download/details.aspx?id=8442
Achtung: wenn man das ISO für das SDK herunter ladet wird die richtige Version benötigt. Ich habe hier Windows 7 64 Bit und habe deshalb „GRMSDKX_EN_DVD.iso“ ausgewählt. Ist Visual Studio C++ 2010 Service Pack 1 installiert worden, muss zusätzlich auch noch ein Compiler Update installiert werden: http://www.microsoft.com/de-de/download/confirmation.aspx?id=4422
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
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 ;
Öffnen wir als nächstes Visual Studio C++ 2010 Express
Unter Extras/Einstellungen aktivieren wir „Erweiterte Einstellungen“
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.
Mit einem Doppelklick auf den Ordner Hybrid | x64 öffnet sich das Eigenschaftenseiten Fenster.
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.
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.
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 :).
Change Color Texture And Render
Mit diesem 3Ds Max Script lassen sich Texturen und Farben von Materialien austauschen und das Ergebnis im Batch rendern. Gedacht ist das Ganze wenn man ein und die selbe Szene öfters in verschiedenen Farbvariationen rendern muss.
Download: Multi_Change_Color_Texture_And_Render
Search Materials And Textures
Mit diesem Script lassen sich Materialien und Texturen auflisten, suchen und Texturepfade anpassen.
Download: https://github.com/jb-alvarado/SearchMaterialAndTexture
Tweak Arch&Design
Mit diesem Script lassen sich einige Material-Parameter des Arch&Design Material (mia_material) global steuern.