Leonardo3D Demo

This is a demo on the usage of Leonardo 3D. In it, I go through the steps of making a model of an indoor female volleyball player. You may click on all the reduced screenshot to get a larger view.

To being with, I start up the application by typing modeler at the command line. The Leonardo 3D window pops up, mostly empty.

[DEMO SCREENSHOT 1]

The Leonardo 3D window comprises three panels. The left panel is an expandable tree widget, its items representing aspects of the character you're working on. The second is a panel of parameters associated with each item in the tree: whenever you select an item in the tree, a set of controls appear allowing you to adjust the parameters of that item. The third is the character display area. There's also a menu bar on top, and a status bar on the bottom (which, so far, has never been used).

Let's take a sidetrack and describe what things can appear in the tree. The root of the tree is "character," which three branches: "parts", "motions", and "sections." A part is pretty much anything between two joints, or on the end of a joint. So, a part could be right_foot, left_upperarm, head, chest, etc. The list of parts is built in. Leonardo3D does model not fingers and toes: it stops at the hands and feet.

Parts are further divided into models. A model is an object to be displayed in a fixed position relative to the part. So, when the joints of the character move, the models move. The right_hand part could contain a model of a fist. It could also contain a model of a sword, or anything else that moves whenever the hand moves. A part can contain multiple models, and the models can be controlled independently. So, you could have both a fist model and and open hand model, but only drawing one at a given time, thus simulating fingers.

Models are further divided into one or more materials. Materials define the colors and reflective properties of an object.

Motions are somewhat misnamed: a motion can be either an animation or a still frame. Motions contain information about how and when to move the joints. Motions are parameterizable. One important motion is called pose: this "motion" is a still frame that defines all the joint angles as parameters. Therefore, you can put the character into any pose you wish.

Sections are images that you can load to help get proportions right, if you're modeling a person closely. They appear along the the normal planes in the character view, and you can line them up to the character to get a nice cross-section view to work with.

Ok, back to the demo. Now, it's time to add a part. I'll start with the upper body. In the tree, I select "chest" (under "parts"), and click on "Load new model" in the center panel. In the dialog box that pops up, I select the file "midsection/fchestb.3ds," and click open. (The filename "fchestb" means Female Chest B-Cup.) A chest will appear in the character view, and a subitem of "chest," representing the model just loaded, will appear in the tree.

[DEMO SCREENSHOT 2]

Now, I load left and right forearms using file "limb/open8.3ds" (which means a limb that is open on both ends, i.e., a hollow tube, and has an octagonal cross-section). Then I load the left and right upper arms using file "limb/closed8.3ds". (This is a limb closed on the bottom end with a hemispherical dome.) I also took care to give the models decent names; this can be important when programming the character in Python.

[DEMO SCREENSHOT 3]

You can see that the parts don't fit together perfectly. The ends of the upper arms, for example, are too large for the chest object and protrude through the shoulder. So eventually I'll fine tune the size and position of the models.

First, however, I'm going to give them some color, as it will be easier to see where the models overlap. What I do is select the material associated with the models, and adjust the ambient and diffuse color. (I'll leave specular color for later.) Roughly speaking, ambient color is color of an object in the shade, while diffuse color is the color of an object in the light, after subtracting the ambient color.

[DEMO SCREENSHOT 4]

One other thing I'm going to do is add some motions so I can see the joint in various angles. I select "motion" from the tree, and click on "Load new motion" in the panel to add motion. I've added three motions here: a pose motion, a run motion, and a fullrange motion. The fullrange motion moves each joint over it's typical range, and is thus very useful in making sure the parts fit together nicely. They are all found in the "basic" subdirectory.

Once the motions are loaded, selecting that motion in the tree will cause the character to do that motion.

[DEMO SCREENSHOT 5]

Now, it's time for me to fine tune the size and position the models.

Aside: The axis system of the character is important when fine tuning the 3D models. The character's origin is normally the spot on the ground beneath the character's feet. The x-axis points to the right, the y-axis points forward, and the z-axis points up.

The character's baseline pose is standing straight up, arms at the side: much like a soldier standing at attention. When adjusting a model, the axes refer to the model when it's in this baseline position. Thus, changing the z-factor of a limb with lengthen or shorten it, because the limb runs along the z-axis in the baseline position.

To do adjust the models, I select the model in the tree, and adjust the parameters that specify size, taper, position, and orientation of the model. The models are already oriented correctly. However, the upper arms are a little too thick, so I reduce the x- and y-factors a bit. Also, when the elbow bends, I can see the forearms projecting a little too far past the elbow, so I reduce the z-factor just a tad.

[DEMO SCREENSHOT 6]

Also, in most people, forearms tend to taper a little. So I adjust z-taper of the forearms a little bit, as well as z-factor and z-offset, as the tapering tends to affect the others.

Advanced aside: Ever wonder what the bottom row of an OpenGL matrix does? It's usually [0,0,0,1]. What if you set the zeros to something else? Well, we've just seen it: it tapers the object. Leonardo 3D takes advantage of this.

Finally, I adjust the chest a little. The goal is to get it so that the arms can swing in any direction, and the hollow end of the upper arm never sticks out of the shoulder area. And, frankly, she's a little thin. I adjust yfactor to thicken her up, and that also takes care of the protruding forearm. Now, the shoulder and elbow can move to any angle, and it looks natural.

[DEMO SCREENSHOT 7]

Now for the lower body. I proceed much as I did with the upper body. I load a pelvic region (which is called "belly" in the parts list) from file "midsection/fhips1.3ds", thighs from "limb/open6_s33.3ds", and limbs from "limb/open6_s50.3ds".

[DEMO SCREENSHOT 8]

Now, looking at the above, you'll notice two or three unusual things. First of all, the hips appear way too large. The reason for this is that the hips joints are set too far apart. To fix this, I select "character" in the tree widget (where there is list of body dimensions), and set the width of the hips to seven inches (that's about 18 cm for my metric friends). Of course, this is not the actual width of the hips, but the distance between the two hip sockets, which is surprisingly smaller. The size of the belly hip models is scaled to the hip width, so reducing the hip width correspondingly reduces the hips to reasonable size.

Now, you might be asking, why do you have to select "character" to set body proportions, when you haven't done that to resize the 3D models? Well, there's a difference between resizing a model, and setting body proportions. When you resize a model, all you are resizing is the 3D graphical image. The distance between the joints stays the same. When you need to change the actual distance between joints, then you have to go to "character" to change it.

The second odd thing you may have noticed is that the thighs and calves have two different colors. This is because the "open8_s33.3ds" file contains two materials. (The "s33" part of the filename indicates that the break is 33% of the way down.) These models have two materials exist so I can draw spandex on the thighs and socks on the calves.

The third odd thing you probably didn't notice unless you're real sharp is that I loaded two open-ended limbs. Won't you see the open ends when she runs? Ordinarily, yes. Not in this case, however, because volleyball players wear kneepads. Therefore, I load the model "armor/kneepad.3ds" into the two calf parts. (Kneepads look more natural when attached to the calf than to the thigh.)

Now I adjust all the sizes and positions until they look natural. The thighs need widening, the calves need thinning and tapering, the kneepads need rescaling. The hips need a lot of work; I've found hips to be the hardest part to get right. Having done that, I set the appropriate colors.

[DEMO SCREENSHOT 9]

She looks pretty good. Before getting to the extremities, I think I'll give her shirt a logo. I select the chest's material in the tree, and click the button next to the label "texture": it pops up a dialog box. I select a custom file "psu15.png". For now, the models have fixed texture coordinates, but it's not too hard to rotate them.

[DEMO SCREENSHOT 10]

Another minor cosmetic change before we move on to the head, hands, and feet is to add some shininess to the skin. To add shininess, I set the specular color to some value (specular color is normally a gray), and set the shininess parameter. I quite a bit of shininess into the legs and somewhat less in the arms.

[DEMO SCREENSHOT 11]


Unfinished. . . . Hands and head to come someday. Main problem is I haven't yet made any decent models of heads and hands. I have made the shoes. I may add an aside on creating models, and finish with using the model in a program.


Feedback

Comments, questions?

My current address is leonardo3d-23@aerojockey.com.


Copyright (c) 2001-2008 Carl Banks. All Rights Reserved.