Director Tutorials

 

Lighting Lingo

In the next set of tutorials, we will explore specific elements of controlling a 3D environment. Each will build on the tutorial before, and we will end up with a sophisticated 3D environment, of which you will have total control.

The Lingo is explained primarily in comments in the scripts. Occasionally, additional information is provided outside the script.

Turning on the Lights - 3D Lighting

Before you start, you will need to download the following Director movie - 3Denv.dir, which contains a shockwave 3D cast member created in 3DS Max.

1. Create a pause frame behavior in frame 2 of the scripting channel.

2. Create a new behavior attached to the 3D sprite with the following code:

property p3Dmember -- reference to 3D cast member

on beginSprite me
-- create a reference to the 3D member
p3Dmember = sprite(me.spriteNum).member

-- reset 3D member to its original condition
p3Dmember.resetWorld()

end

on mouseUp
letThereBeLight
end

In the beginSprite handler are standard 3D Lingo statements that you may use in any Shockwave 3D application. We create a property variable, p3Dmember, that references the 3D cast member and we use resetWold() to reset the 3D scene to its original state.

In the mouseUp handler, letThereBeLight calls a custom message to create a majestic light source (well you be the judge of how great). I have grouped together the lighting code in its own custom handler for organisational purposes. It would work just as well if all these statements were simply included in the mouseUp handler.

2. OK, to the lighting Lingo. Continue writing the following code elements into the same script:

on letThereBeLight

-- create a new point light
p3Dmember.newLight("Bulb Light", #point)

The newLight command creates a light with a unique name, in our case it's Bulb Light (the first parameter of the command). We set the type of light to #point (second parameter). The light type can be #ambient, #directional, #point, or #spot.
#ambient - generalised light in the 3D world.
#directional - light from a specific direction.
#point - light source like a light bulb.
#spot - a spotlight effect.

For more information on light types, look at The make-up of Shockwave 3D Casts Technote.

-- define light color and intensity
p3Dmember.light("Bulb Light").color = \
rgb
(255,0,255)

The light colour property ranges from rgb(255,255,255), which is pure white to rgb(0,0,0), which is no light at all. The default setting is rgb(191,191,191).

p3Dmember.light("Bulb Light").specular = 1

The specular property defines whether or not the light produces highlights on surface. It is either TRUE (1) or FALSE (0). The property is ignored for ambient light.

-- move the position of the light to x=0 y=0 z=100
p3Dmember.light("Bulb Light").transform.position = \
vector
(0,0,100)

end

3. Rewind and play the movie. Press the mouse button a few times.
The first time the mouse button is pressed, the light turns on. The second time it is pressed, you get an error message. This is because Director attempts to create a second light with the same name as the first. In a 3D world, every object must have a unique name.

4. Place the following statement before the statement with the newLight command:

if
voidP(p3Dmember.light("Bulb Light")) then

Using the voidP() function, we can check if the expression in brackets has a value or is void. If Bulb Light does not yet exist, the function will return as TRUE and so the next line of code will be activated, which is the creation of the light. If the light already exists, then Director will ignore the subsequent statements (until it sees end if).

Place the following after the last lighting statement.
end if

3. Rewind and play the movie. Press the mouse button a few times.
You can download the completed movie from here