In building the biometrics proof of concept (see last post) I used an animated object. This animation shows a human hand being placed down onto a flat surface in a variety of poses. In this case, we place a fingerprint scanner object as this surface.
A Caspian 3D artist quickly knocked this together using the technique of vertex animation in 3DS Max. This was then imported into Thinking Worlds (see guide here). For non techies like me, I simply receive a single object file that I drop into the Thinking Worlds object folder. I can then select and manipulate this object just like any other.
You may notice that there is a body missing from this hand. In the course of the simulation I use close up cameras so that the hand always looks like it belongs to a passenger. This saves my artists having to animate hands on many different characters. Clever readers will notice too that it is a male hand. This was pointed out to me when I had a female passenger approach the desk – so not every design saving trick works.
The scenario is very simple. There are a bunch of passengers in a queue in immigration control. They approach the immigration desk one at a time for checks. In the full sim we’ll have passport checks with database searching and much more elaborate question and choices etc but for this example we were checking how the fingerprint process went.
The passenger approaches the desk and provides a fingerprint. The fingerprint type will be randomly selected from 5 different ones. One of these is correct, with the hand placed nicely on the scanner. The other 4 will show various errors of hand/finger positioning and rotating. Camera work will provide the user with a close view of the hand and fingers on the scanner from multiple angles. The camera will then switch to the view of the immigration officer and will show the fingerprints on a computer screen. The officer then must decide whether to pass the passenger or to advise them to try again. This can occur a maximum of 3 times. On the 3rd try a correct fingerprint position will automatically be shown.
Scoring records – correct decisions, number of prints passed and the errors made.
Another passenger then approaches the desk and the process repeats until 3 passengers have been processed.
The user is given a quick breakdown of their scoring at the end.
The scene setup looks like this:
A single path is used for each of the characters to approach the desk. A marker on the path rotates the character towards the desk ready for the fingerprint. Several markers are positioned above the scanner to move the camera around the hand model as it animates.
The scene flow looks like this:
1 – sets up the variables to control the scene (scores, checking how many passengers have been processed, etc). Removes objects that are to be hidden. Sets up the HUD to show the scoring icons.
2. Randomly selects one of the five object animations to play. Moves the camera around the hand object. Switches the camera to the computer screen. Displays the appropriate print on the computer screen. Gives the user the decision point to process the fingerprint.
3. Updates the scoring. Decides what to do next – try again, new passenger, show feedback, end sim.
The fingerprint process is the meaty bit. However, there is a lot of shared logic. So authoring was pretty easy. Once I had set up the first one I cloned it four times and made a few changes to each clone.
Animating the hand object is very easy. There is a node “Start Vertex Animation”. This allows you to select the object that is animated. Click on Animation Selection and it will show you the animations available – an object can have multiple animations. In this case the object had 3 different animations. Select the one that you want and then this will be played when you want it.
I cloned the object itself twice. Then positioned these objects in different positions on the scanner object – slightly to the side and on a diagnal. In each branch from the random node I then just switched the properties of the Start Vertex Animation node – choosing the hand object I wanted, and then choosing the right animation to be played on that object at that time. Easy as that.