HOME Lernen 3D Autodesk 3ds Max

Maxscript: Variabel in Loop deklarieren

 
 
LinkBack (1) Themen-Tools Thema durchsuchen
Alt 19.01.2009   1 externe Verweise auf diesen Beitrag. Zum Ansehen klicken. #1

Neuling

 
Benutzerbild von Darkalan
Mitglied seit: 21.07.2008
Beiträge: 18
Darkalan eine Nachricht über ICQ schicken
Maxscript: Variabel in Loop deklarieren

Hi,

habe ein kleines Prob ich will in MaxScript die Fibonacci Sequenz haben. Dazu müsste ich pro loop eine neue Variable deklarieren. Soll am Ende also so Aussehen: f(1)=1 f(2)=2 f(5)=5 usw.
Aber wenn ich z.B. im loop schreibe f(i)=i+1 oder ähnliches. Bekomm ich ne Fehlermeldung.
Ich hoffe jemand von euch lann mir Helfen.
Danke im Vorraus.
Darkalan ist offline  
Alt 19.01.2009   #2

MXS Padawan

 
Benutzerbild von Piflik
 
Mitglied seit: 30.11.2008
Beiträge: 1.463
Piflik eine Nachricht über Skype™ schicken
AW: Maxscript: Variabel in Loop deklarieren

Für ne Fibonacci Folge nimmst du am besten ein array. Das sähe dann etwa so aus. (Keine Garantie, dass es funktioniert. Ich mach das gerade Freistil...)

Code:
global arr = #() --Deklaration eines leeren Arrays

arr[1] = 1   --die ersten beiden Einträge der Fibonacci Folge
arr[2] = 1

for i = 3 to 1000 do
(
arr[i] = arr[(i-1)] + arr[(i-2)]    --Errechnen und Speichern der Einträge
)
Piflik ist gerade online  
Alt 19.01.2009   #3

Neuling

 
Benutzerbild von Darkalan
Mitglied seit: 21.07.2008
Beiträge: 18
Darkalan eine Nachricht über ICQ schicken
AW: Maxscript: Variabel in Loop deklarieren

Vielen Dank
genau das brauchte ich.

So nun habe ich Quadrate mit den Zahlen der Fibonacci-Folge. Allerdings sind alle noch um den Ursprung gordnet. Sollten aber wie auf diesem Bild geordnet werden:
Bild anklicken für Originalgröße

Hatt jemand von euch ne Idee bin schon den ganzen Tag nun am Rätseln.
Ich habe heute mit MaxScript angefangen also habt Nachsicht mit mir.
Soweit bin ich:
Edit: habe ne Lösung vollständiger Code nun unten.
Darkalan ist offline  
Alt 20.01.2009   #4

Neuling

 
Benutzerbild von Darkalan
Mitglied seit: 21.07.2008
Beiträge: 18
Darkalan eine Nachricht über ICQ schicken
AW: Maxscript: Variabel in Loop deklarieren

ICh denke ich habe nun ne Möglichkeit gefunden.
Allerdings kann ich nicht prüfen ob sie funktioniert da Max nen Fehler ausspuckt...

 
-- Error occurred in i loop; filename: C:\Dokumente und Einstellungen\Grafix\Lokale Einstellungen\Anwendungsdaten\Autodesk\3dsmax\9 - 32bit\enu\scripts\Fibonacci.ms; position: 2425
-- Frame:
-- i: 14
-- Type error: if-test requires BooleanClass, got: 14
Kann mir jemand den Code korrigieren?

 
global arr = #() --Deklaration eines leeren Arrays

w = 15 --Wiederholungen

arr[1] = 1 --die ersten beiden Einträge der Fibonacci Folge
arr[2] = 1

for i = 3 to 100 do
(
arr[i] = arr[(i-1)] + arr[(i-2)] --Errechnen und Speichern der Einträge
)

for i = 2 to w do --Erstellen der Quadrate
(
q = arr[i]
Rectangle length: q width: q

)

for i = 2 to w-1 do --Quadrate selektieren und Pivot verschieben
(

if i<10 then

S="Rectangle0" + i as String

else

S="Rectangle" + i as String


q = arr[i+1]

S = getNodeByName S
select S
x=q*0.5
y=q*-0.5
S.pivot = [x,y,0]
move $ [-0.5*q,0.5*q,0]
)

S = getNodeByName "Rectangle01" ---Erstes Quadrat korrigieren
select S
move $ [-0.5,0.5,0]

clearSelection() --Alles deselktieren
select $Rectangle* --Alle Quadrate selektieren

deselect $Rectangle01--Ausnahmen
move $ [2,0,0]
deselect $Rectangle02

oben=true
links=false
unten=false
rechts=false


for i=2 to w-1 do --schleife verschiebt Quadrate
(

if oben then --Oben
print"oben"
move $ [0,arr[i+1],0] --In richtige Position bringen

if i<10 then --Jetziges Quadrat deselektieren

S="Rectangle0" + (i+1) as String

else

S="Rectangle" + (i+1) as String

S = getNodeByName S
deselect S
oben=false --Nächste Richtung vorgeben
links=true
unten=false
rechts=false


if links then
print"links"
move $ [-1*arr[i+1],-1*arr[i],0]

if i<10 then --Jetziges Quadrat deselektieren

S="Rectangle0" + (i+1) as String

else

S="Rectangle" + (i+1) as String

S = getNodeByName S
deselect S
oben=false --Nächste Richtung vorgeben
links=false
unten=true
rechts=false

if unten then
print"unten"
move $ [arr[i],-1*arr[i+2],0]

if i<10 then --Jetziges Quadrat deselektieren

S="Rectangle0" + (i+1) as String

else

S="Rectangle" + (i+1) as String

S = getNodeByName S
deselect S
oben=false --Nächste Richtung vorgeben
links=false
unten=false
rechts=true

if rechts then
print"rechts"
move $ [arr[i+2],0,0]

if i<10 then --Jetziges Quadrat deselektieren

S="Rectangle0" + (i+1) as String

else

S="Rectangle" + (i+1) as String

S = getNodeByName S
deselect S
oben=true --Nächste Richtung vorgeben
links=false unten=false
rechts=false

if i=w-1 then exit
Da der Code hier drin ist nehm ich den Code aus dem oberen Beitrag raus.
Darkalan ist offline  
Alt 20.01.2009   #5

MXS Padawan

 
Benutzerbild von Piflik
 
Mitglied seit: 30.11.2008
Beiträge: 1.463
Piflik eine Nachricht über Skype™ schicken
AW: Maxscript: Variabel in Loop deklarieren

In der letzten zeile steht
Code:
if i = w-1 then exit
Das sollte
Code:
if i == w-1 then exit
sein.

Für ne abfrage brauchst du zwei "=". Wenn du nur eins nimmst, ist das ne Zuweisung. (d.h. i wird auf 14 gesetzt und "if 14" macht keinen Sinn. Deshalb auch die Fehlermeldung. If braucht einen Booleschen Wert, also "if true" oder "if false".)

Ich schau mir jetzt mal den Rest des Codes an. Vielleicht finde ich noch was...
Piflik ist gerade online  
Alt 20.01.2009   #6

Neuling

 
Benutzerbild von Darkalan
Mitglied seit: 21.07.2008
Beiträge: 18
Darkalan eine Nachricht über ICQ schicken
AW: Maxscript: Variabel in Loop deklarieren

Kannst du mir sagen mit welchem Befehl ich Max "sage" es soll die schleife hier stoppen und von vorn beginnen?
Darkalan ist offline  
Alt 21.01.2009   #7

MXS Padawan

 
Benutzerbild von Piflik
 
Mitglied seit: 30.11.2008
Beiträge: 1.463
Piflik eine Nachricht über Skype™ schicken
AW: Maxscript: Variabel in Loop deklarieren

Wie man eine Loop neustartet weiß ich leider nicht. Ich bin mir nicht mal sicher, ob das in MXS überhaupt funtioniert. In C++ würd ich break, return, continue oder goto benutzen, aber die gibts in MXS nicht, bzw haben eine andere Funktion.

In der Zwischenzeit hab ich mir mal dein Script angesehen, und ich muss sagen, es ist doch etwas konfus. (Selbst für nen Anfänger ). Manche Teile verstehe ich gar nicht (zB warum du die Pivots aller Rechtecke bis auf das erste verschiebst, obwohl du in dem ganzen Script keine absoluten Positionen angibst, sondern nur relative Verschiebungen, oder warum du 100 Fibonacci Zahlen berechnest, aber nur 14 Rechtecke erstellst.)

Aber ich glaube, ich weiß was du machen willst und habe einen etwas kürzeren Code geschrieben, der das bewerkstelligt. Wenn du Fragen zu einem bestimmten Abschnitt hast, meld dich.

Ansonsten kann ich dir empfehlen, die "How to..." Scripte in der MaxScript Reference oder Bobos Lessons zu machen. Da lernt man echt viel.
Und immer schön weiter scripten...

Code:
global arr = #()

global w = 15
global pos_Alt =[0,1,0]  --alte Position

arr[1] = 1  --die ersten 2 Fibonacci Zahlen
arr[2] = 1

Rectangle length: 1 width: 1 pos: [0,0,0]  --die ersten 2 Quadrate
Rectangle length: 1 width: 1 pos: [0,1,0]

for i = 3 to 100 do
(
  arr[i] = arr[i-1] + arr[i-2]   --Berechnen der Fibonacci Zahlen
  
  if i < w then
  (	
    Rectangle length: arr[i] width: arr[i] isSelected: true  --Erstellen der Qudrate

    a = arr[i]/2 as float   --halbe Kantenlänge des aktuellen Quadrates
    b = arr[i-1]/2 as float   --halbe Kantenlänge des letzten Quadrates
    c = arr[i-2]/2 as float   --halbe Kantenlänge des vorletzten Quadrates
  
    case of   --berechnen des Offsets zum letzten Quadrat
    (
      (mod i 4 == 3): pos_Neu = [a+b,-1*c,0]			
      (mod i 4 == 0): pos_Neu = [-1*c,-1*(a+b),0]  
      (mod i 4 == 1): pos_Neu = [-1*(a+b),c,0]
      (mod i 4 == 2): pos_Neu = [c,a+b,0]
    )
    $.pos = pos_Alt + pos_Neu  --Position des aktuellen Qudrates
    pos_Alt = $.pos  --Speichern der aktuellen Position
  )

)
Piflik ist gerade online  
Alt 21.01.2009   #8

Neuling

 
Benutzerbild von Darkalan
Mitglied seit: 21.07.2008
Beiträge: 18
Darkalan eine Nachricht über ICQ schicken
AW: Maxscript: Variabel in Loop deklarieren

Code:
    case of   --berechnen des Offsets zum letzten
    (
      (mod i 4 == 3): pos_Neu = [a+b,-1*c,0]            
      (mod i 4 == 0): pos_Neu = [-1*c,-1*(a+b),0]  
      (mod i 4 == 1): pos_Neu = [-1*(a+b),c,0]
      (mod i 4 == 2): pos_Neu = [c,a+b,0]
    )
    $.pos = pos_Alt + pos_Neu  --Position des aktuellen Qudrates
    pos_Alt = $.pos  --Speichern der aktuellen Position
  )
Kannst du mir diesen Teil genauer erläutern? Verstehe ihn nicht.

Edit: also Case of heißt praktisch er prüft welche der Bedingungen zutrifft ist und führt dann das dahinterstehende aus. Aber was bedeutet:

Code:
(mod i 4 == 3):
Darkalan ist offline  
Alt 21.01.2009   #9

MXS Padawan

 
Benutzerbild von Piflik
 
Mitglied seit: 30.11.2008
Beiträge: 1.463
Piflik eine Nachricht über Skype™ schicken
AW: Maxscript: Variabel in Loop deklarieren

Genau. Case prüft die (in diesem Fall) 4 Bedingungen der Reihe nach von oben nach unten und die erste, die zutrifft, wird ausgeführt. D.h. wenn mehrere zutreffen, wird trotzdem nur die erste angewandt.

Code:
mod i 4
ist eine Modulo Operation. Es teilt i durch 4 (ganzzahlig) und der Rest ist das Ergebnis. Also 3 modulo 4 ist 3, da 4 in 3 keinmal reinpasst und der Rest gleich 3 ist. 7 modulo 4 oder 11 modulo 4 ist auch 3.

Daher werden das 3., 7. und 11. Rechteck nach rechts-unten verschoben.
Das 4., 8. und 12. Rechteck wird nach unten-links verschoben, da 4 mod 4, 8 mod 4 und 12 mod 4 jeweils 0 ergibt.

Solche Modulo Operationen bieten sich immer an, wenn man in einer Loop zyklisch etwas machen will, zB in jedem 5ten Durchlauf, da mod immer wieder die selben Ergebnisse durchläuft. (also bei mod 4: 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, .....)
Piflik ist gerade online  
Alt 21.01.2009   #10

Neuling

 
Benutzerbild von Darkalan
Mitglied seit: 21.07.2008
Beiträge: 18
Darkalan eine Nachricht über ICQ schicken
AW: Maxscript: Variabel in Loop deklarieren

Vielen Dank das war wirklich sehr hilfreich und vorallem hab ich einiges dabei gelernt.
Darkalan ist offline  
Themen-Tools Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

LinkBacks (?)
LinkBacks zu diesem Thema: http://pixelplausch.de/autodesk-3ds-max/2658-maxscript-variabel-loop-deklarieren.html
Erstellt von für Art Datum Hits
CGTalk - fibonacci / golden ratio dieses Thema Refback 28.01.2009 00:52 4