This tutorial should take around 10 minutes to complete
or this tut, we'll have a look at the random function, object positioning and also
do some more loops for practice.
For this tut, we'll have a look at the random function, object positioning and also
do some more loops for practice.
Intro
Here is our hypothetical scenario. We want to build a fence across a
field. We have made an array of tall boxes - 20 of them - for fence
posts unfortunately they look really uniform and CG like. What to
do? Maxscript to the rescue.
The Random Function
Open the listener and type in the following command:
random 1.0 35.0
Maxscript will return a float number between 1 and 35. Notice how putting .0 after the
number
made maxscript realise that we wanted it to generate floats and not integers.
Now we'll make a variable with a random integer between 1 and 6
diceThrow = random 1 6
Now whenever we access the diceThrow variable we made, it will contain the number that it
randomly chose when we first created the variable.
Randomizing post heights
Create an array of about 20 boxes. They should have their pivot on the ground and be 10 x
10 by
100 high. Make the spacing about 150 units.
I'm sure that you have a rough idea in your head by now of how we will go about this. Here
is the
code:
for obj in $ do
(
randHeight = random 90.0 110.0
obj.height = randHeight
)
We have the same loop as last time. For all the objects in the selection, execute the
following code:
randHeight = random 90.0 110.0 - Make a variable with a random float between 90 and 110 in
it.
obj.height = randHeight - Assign that variable to the objects height.
Select all your fencepost boxes and run the code. Now all the posts should have slightly
different
heights!
Position
Create a sphere in the scene and select it.
The way Maxscript accesses the position of objects is with the .position (or .pos)
property.
If you type:
$.pos
Maxscript should return: [12.3434,34.6446,0] or similar. You exact results will depend on
where
you made the sphere in your scene.
Point 3 Data type
This result is a special type of data type called a Point3 data type. It contains X Y and
Z values
always in that order. If we assign one to a variable:
ourPoint3variable = [5,4,1]
and then type this:
ourPoint3variable.y
Max will return 4 which is the Y component of our Point3. If we just type:
ourPoint3variable
Maxscript will return all the values - [5,4,1]
Position (and many other things) in 3D often needs 3 values, X, Y and Z so a Point3 is a
very
useful data type.
Moving Objects
Back to setting an objects position.
We could type the following:
$.pos = [0,0,0]
that will move our selected sphere to the center of the world. We are giving the sphere
explicit co-
ordinates to go to. What if we want to move it relative to where it is now?
maxscript provides a move function to do just that.
move $ [3,2,0]
That is simply saying "Move the selected object +3 units in X, +2 units in Y and 0 units
in Z"
type:
$.pos
Now maxscript will return the position as [3,2,0]
Execute the move line again:
move $ [3,2,0]
Then ask the position:
$.pos
You'll see that it is now at [6,4,0]
Delete the sphere. (if you want to be fancy, type: delete $)
Now we want to randomise the position of all the posts slightly.
Randomizing Position
Select all the posts again.
Here is the code we are going to use.
for obj in $ do
(
randX = random -5.0 5.0
randY = random -5.0 5.0
move obj [randX,randY,0]
)
Lets step through it.
For each object in our current selection do:
Create a random float between -5 and 5 and assign it to the variable randX
Create a random float between -5 and 5 and assign it to the variable randY
move the current object according to the following Point3. Where it says randX in the
point3,
maxscript will substitute in the random number it generated earlier. The same goes for the
randY.
we don't want the posts to move vertically so we have just put in a 0.
Highlight the code and run it.