Crowd

How it works

Each figure is placed in the scene with a single line as shown in this example:

This scene, Parade, is created by the following PovRay script:

#version 3.7 ; background {color rgb 1/2} #include "colors.inc" #include "People.inc"

global_settings { assumed_gamma 1 max_trace_level 100 }

camera{location <0,0,-20> angle 15 look_at <0,1,0> } light_source{<00,200,-200> rgb <1,.9,.5> }

box {<-.5,.3,-.2>,<.5,0,.2> rotate <0,45,0> translate <1,0,0> pigment {rgb<.5,.3,.2>}}

PUT(Walking)AND(.5,Stride)Bob_Red(<2.6, 0, 4>,<0,90,0>)

PUT(Squat)AND(.5,Spread_Arm)Bob (<1.7,0,.7>,<0,45,0>)

SIT(.3)BOTH(.7, Hand_Forward)AND(.5,Twist_Body)AND(-.3,Look_down)AND(.3,Look_side)Daisy (<1.2, 0, -.2>,<0,45,0>)

SIT(.3)BOTH(.74,Hand_Forward)AND(-.3,Look_down)AND(.3,Look_side)Mary(<.8,0,.2>,<-0,45,0>)

PUT(Standing)AND(.2,Raise_hand)Ron (<.15,0,0>,<0,-45,0>)

PUT(Standing)AND(.5,Twist_Body)LEFT(.4,Hand_Forward)BOTH(.2,Leg_apart)AND(.2,Look_down)Sally (<-.26,0,-.3>,<0,-45,0>)

PUT(Standing)AND(-1,Twist_Body)AND(.8,Hand_on_Hip)LEFT(1,Raise_hand)Jim(<-.8,0,1>,<0,-20,0>)

PUT(Standing)AND(-.7,Tilt_Hips)AND(.1,Leg_apart)LEFT(.6,Leg_apart)LEFT(1.5,Twist_Body)BOTH(.8,Hand_on_Hip)LEFT(.4,Point_Toe) Samantha (<-1.5,0,0>,<0,-150,0>)

PUT(Tease) Samantha (<-2.2,0,0>,<0,-150,0>)

The "Pose" parameter is an array of 15 angle vectors that determine the angles of the various parts of the parts of the body. Particular Poses are given names, so that in Raise_Hand all the vectors are zero except for the angles of the right upper arm and fore arm.

The programme line placing figures consist of a seris of macros, starting with either PUT() or SIT().

This is followed by any number of the macros AND(Scale Factor,Pose), LEFT(Scale Factor,Pose) and BOTH(Scale Factor,Pose). What happens is that the initial PUT() sets up an initial "Pose", for example PUT(Standing) all the angles in the array are zero. Each subsequent Macro adds the individual angles of its "Pose", scaled by its "Scale Factor

For example let us take Sally in the above scene. We can copy the figure definition into Pose_Studio.pov and see the figure from different angles:

The programme line defining the figure is:

PUT(Standing)AND(.5,Twist_Body)LEFT(.4,Hand_Forward)BOTH(.2,Leg_apart)AND(.2,Look_down)Sally (<-.26,0,-.3>,<0,-45,0>) 

PUT(Standing) sets up an initial Pose array, in this case "Standing" has all the angles set to zero. The Pose array "Twist_Body" has a 45 degrees rotation of the chest around the Y axis. This is multiplied by the scale factor, .5 so the macro adds 22.5 deg to this angle in the initial Pose.

Poses of limbs are defined for the right side and rotations of the torso and head are to the right. So with AND(4,Hand_Forward) it would be the right hand

LEFT() swaps the limb angles of the Pose between the left and right sides and changes the torso and head rotations to the opposite sense. Thus with LEFT(.4,Hand_Forward) it is the left hand

Finally BOTH(.3,Raise_hand) applies the limb angles for the right to the left side as well.

The last macro in the programme line, Sally(Location,Angle) is defined with a particular body shape, hair style and clothes. Location is where she is placed, her X and Z origin a point on the spine just above the waist and Y is the lowest point of the figure, ground level. Angle is the direction she faces at the hip level.

SIT() is different. It sets the initial Pose, "Sitting", with just the thighs horizontal. It takes a single length paramenter which is the height of the seat. The figure is placed with their bottom on the seat. If the feet would be lower than the seat height the angle of the thigh is increased so that the feet touch the floor. If the feet do not reach the floor the thighs remain horizontal and the feet dangle. The results can be seen for the two figures Daisy() and Mary() in Parade above.

At the end of Pose_Studio the are a few lines commented out that will save the result of combining all the component Poses into a single Pose. This is illustrated with Samantha who has a fairly complex pose that can be summed up as a single named parameter.