|
|
|
Box von außen
Um bei einem Würfel oder Quader die Seitenflächen mit
unterschiedlichen Texturen zu belegen, müssen sechs Shader
mit sechs Texturen angelegt werden. Wir ändern das Grundgerüst
aus Listing 1, indem wir die
beiden Vorgänge in einer gemeinsamen repeat-Schleife
erledigen.
Listing 1c
-- --------------------------
-- 2. Modelresource anlegen
-- --------------------------
if voidP(mmb.modelresource("resBox")) then
Res = mmb.newModelResource("resBox", #box, #front)
else
Res = mmb.modelresource("resBox")
end if
-- --------------------------
-- 3. Model anlegen
-- --------------------------
if voidP(mmb.model("Model1")) then
mymod = mmb.newModel("Model1", Res)
else
mymod = mmb.model("Model1")
end if
-- --------------------------
-- 4./5 Shader und Texturen anlegen und zuweisen
-- --------------------------
textureMemberList = \
["text3","text2","text4","text5","text1","text6"]
-- Für jede der sechs Seiten einen Shader
-- und eine Textur erzeugen
repeat with a = 1 to 6
thisName = textureMemberList[a]
if voidP(mmb.shader(thisname)) then
myShad = mmb.newShader(thisName,#standard)
myShad.ambient = rgb(255,255,255)
myShad.diffuse = rgb(255,255,255)
myShad.renderStyle = #fill
myShad.specular = rgb(255,255,255)
else
myShad = mmb.shader(thisname)
end if
if voidP(mmb.texture(thisName)) then
mytextu = mmb.newTexture(thisName,\
#fromCastMember,member(thisName))
else
mytextu = mmb.texture(thisName)
end if
myshad.texture = mytextu
-- Shader den einzelnen Seiten des Würfels zuweisen
mymod.shaderList[a] = myshad
end repeat
Die shaderlist des Models enthält sodann sechs Shader, die
in Position 1-4 die Seitenflächen des Würfels beschreiben,
Position 5 ist die Ober-, Position 6 die Unterseite. Die Anordnung
der textureMemberList (["text3", "text2",
"text4", "text5", "text1", "text6"])
sorgt dafür, dass, wie bei einem Würfel üblich, gegenüberliegende
Seiten stets die Summe sieben ergeben.
|


 |
|
|
... und von innen
Für den Würfel in der Außenansicht wurde die Modelresource
mit dem Befehl
memref.newModelResource("resBox", #box, #front)
erzeugt. Verwendet man nun statt #front
den Parameter #back, so werden nur die
Innenseiten gezeichnet. Die Idee, die Kamera in den Würfel
zu verfrachten, liegt nahe: damit ist ein Raumeindruck ähnlich
dem von QuickTimeVR zu erreichen.
Das Skript aus Listing 1c wird zunächst nur bei der Generierung
der Modelresource geändert:
memref.newModelResource("resBox", #box, #back)
Probieren Sie es aus der Effekt ist erstaunlich. Damit es
wirklich wie VR aussieht, verlegen wir die Kamera ins
Innere des Würfels und passen das Licht an:
-- --------------------------
-- 6. Light anlegen
-- --------------------------
if voidp(mmb.light("li1")) then
mylight = mmb.newlight("li1", #ambient)
mylight.color = rgb( 255, 255, 255 )
mylight.specular = 1
end if
-- --------------------------
-- 7. Kamera einstellen
-- --------------------------
mmb.camera[1].transform.position = \ vector( 0.0000, 0.0000, 0.0000 )
mmb.camera[1].fieldofView = 80.0
Damit ist der Innenraum vollständig ausgeleuchtet;
die Kamera steht im Ursprung der Welt, um den herum auch der Würfel
aufgebaut ist. Die Angabe des fieldOfView ist nötig, um einen
Weitwinkeleffekt zu erreichen.
Damit Sie den Würfel drehen können (und sich damit scheinbar
im Raum orientieren), nutzen sie am Besten das Bibliotheksbehavior
Drag Model to Rotate mit dem Auslöser (Trigger)
Mouse left. Die Einstellungen für letzteres sehen
Sie in der Abbildung.

|


 |
|
|
Variationen
Anstelle eines Ambient-Lichtes, das den gesamten Würfel ausleuchtet,
wäre es auch reizvoll, ein Spot-Licht zu verwenden. Probieren
Sie die unterschiedlichen Lichttypen aus! In unserem Beispiel machen
wir das Spot-Licht ein Child des Würfels: wird nun der Würfel
gedreht, so dreht sich das Licht mit. Das vorhandene Ambient-Licht
reduzieren wir in der Helligkeit.
-- --------------------------
-- 6. Light anlegen
-- --------------------------
if voidp(mmb.light("li1")) then
mylight = mmb.newlight("li1", #ambient)
mylight.color = rgb( 32,32,32 )
mylight.specular = 1
end if
if voidp(mmb.light("li2")) then
mylight = mmb.newlight("li2", #spot)
myLight.transform.position = \
vector( -66.0000, -66.0000, 44.0000 )
mylight.color = rgb( 255, 200, 200 )
mylight.specular = 1
else
mylight = mmb.light("li2")
end if
mylight.parent = mymod
Wenn Sie statt #spot den Lichttyp auf
#directional stellen, wird jeweils eine
Seite des Würfels voll ausgeleuchtet.
|


 |
|