|
|
|
Ring von
Kugeln erzeugen
Da wir bisher nur ein Model in die Welt platziert haben, konnten
wir auf Positionsangaben verzichten: Es wurde automatisch in die
Mitte, sprich an die Position vector(0,0,0), platziert. Sollen mehrere
Elemente platziert werden, so werden Position und auch Größe
der einzelnen Elemente wichtig.
Der folgende Skriptausschnitt setzt Model1 und seine 11 Clones
nach einfachen trigonometrischen Gesetzen auf Positionen auf einem
Kreis:
-- --------------------------
-- 6a. Models clonen und positionieren
-- --------------------------
faktor = 100
s = sin(pi()/6)
c = cos(pi()/6)
mmb.model("Model1").transform.position = \
vector(c,s,0) * faktor
repeat with i = 2 to 12
if voidP(mmb.model("Model"&i)) then
newmod = mmb.model("Model1").clone("Model"&i)
end if
case i of
2: pos = vector(s,c,0)
3: pos = vector(1,0,0)
4: pos = vector(s,-c,0)
5: pos = vector(c,-s,0)
6: pos = vector(0,-1,0)
7: pos = vector(-c,-s,0)
8: pos = vector(-s,-c,0)
9: pos = vector(-1,0,0)
10: pos = vector(-s,c,0)
11: pos = vector(-c,s,0)
12: pos = vector(0,1,0)
end case
mmb.model("Model"&i).transform.position = pos * faktor
end repeat
Verändert werden nur die x- und y-Positionen. Die Nummerierung
und Positionierung der Kugeln erfolgt wie beim Zifferblatt einer
Uhr.
|


 |
|
|
Wenn Sie das Skript im Anschluß an den bisherigen Block 5
einfügen, so bewirkt der clone()-Befehl, dass ein Duplikat
des Models erstellt wird, das aber weiterhin den Shader des zuvor
erzeugten Model1 nutzt. Mit dem Befehl cloneDeep() werden auch die
Shader und Texturen geclont.
Um also tatsächlich ein Zifferblatt zu erzeugen, bei dem jede
Kugel eine eigene Textur (die Ziffern von 1 bis 12) trägt,
müßte man mit cloneDeep() arbeiten. Der entsprechende
Skriptblock sieht dann so aus:
-- -------------------------- -- 5. Textur anlegen und zuweisen
-- --------------------------
-- --------------------------
-- 6a. Models clonen und positionieren
-- --------------------------
faktor = 100
s = sin(pi()/6)
c = cos(pi()/6)
repeat with i = 2 to 12
if voidP(mmb.model("Model"&i)) then
newmod = mmb.model("Model1").cloneDeep("Model"&i)
end if
end repeat
repeat with i = 1 to 12
case i of
1: pos = vector(s,c,0)
2: pos = vector(c,s,0)
3: pos = vector(1,0,0)
4: pos = vector(c,-s,0)
5: pos = vector(s,-c,0)
6: pos = vector(0,-1,0)
7: pos = vector(-s,-c,0)
8: pos = vector(-c,-s,0)
9: pos = vector(-1,0,0)
10: pos = vector(-c,s,0)
11: pos = vector(-s,c,0)
12: pos = vector(0,1,0)
end case
mmb.model("Model"&i).transform.position = \
pos * faktor
if voidP(mmb.texture("text"&i)) then
mytextu = mmb.newTexture("text"&i, \
#fromCastMember, member("text"&i))
end if
mmb.model("Model"&i).shaderlist[1].texture = mytextu
end repeat
-- --------------------------
-- 7. Kamera einstellen
-- --------------------------
mmb.camera[1].transform.position = \
vector( 0.0000, 0.0000, 400.0000 )
|


 |
|
|
Hier legen wir die Textur nicht in Schritt 5 an, sondern duplizieren
zunächst mit cloneDeep() das Model ohne Textur; den Clones
weisen wir dann innerhalb der zweiten repeat-Schleife 12 unterschiedliche
Positionen und Texturen zu. Das Ergebnis sehen Sie in der Abbildung.

Die Einstellung der Kamera auf einen größeren Abstand
in z-Richtung ist eine Möglichkeit, alle Objekte in den Blick
zu bekommen. Allerdings könnten wir auch von vorneherein den
Abstand der Kugeln vom Zentrum des Kreises (faktor)
verringern, und die Größe der Kugeln nach unseren Wünschen
anpassen. Dafür verändern wir die Modelresource in Schritt
2:
-- --------------------------
-- 2. Modelresource anlegen
-- --------------------------
if voidP(mmb.modelresource("resKugel")) then
Res = mmb.newModelResource("resKugel", #sphere)
Res.radius = 10
end if
Statt des Standardwerts von 25 nutzen wir nun einen Radius von
10 für die Ausgangsresource (und damit auch für alle Clone-Duplikate).
Weitere Einstellmöglichkeiten finden Sie im Abschnitt Modelresources
und ihre Eigenschaften.
|


 |
|