views:

160

answers:

2

The overall goal I'm trying to accomplish is to implement a customizable avatar system where one can change height, weight, body type, etc. How is this done? As a simple example, when you change the height of an avatar you don't want the head/eyes/fingers/etc to get stretched out, you only want the torso and legs to change size and have everything else remain as they were (perhaps repositioned). Another example would be adding a "beer belly". What are existing techniques for that sort of morphing?

Is each morphed piece a separate mesh?

If so, how are the two manipulated pieces "stuck" back together in a believable way (they changed size).

If not, how do you confine your manipulations to one section of the mesh and not the others?

I'm looking for general techniques as well as specific solutions. This is a generic 3D graphics problem but I'm working with Kit3D/Silverlight/C#. This is similar to another question I posted but this is much more general.

+1  A: 

Take a look at the MakeHuman project. (Warning, some potentially not-safe-for-work screenshots may be on the main page. Most are blurred, but fair warning.)

The human body mesh that MakeHuman uses is a simple base mesh with a series of targets that can be adjusted on 4 or 5 axes. The majority of the program is written in Python, so it should be relatively easy to dig through. There are also some whitepapers and other documents on the document site.

greyfade
No worries, the "not safe for work" part is actually part of the work. This is very exciting, it being open source.
colithium
+1  A: 

If your geometry is mesh based, then I suggest you try and generate non-linear transforms (let's call them "deforms").

For example, you could insert N pivot points in your 3D world, then determine for each vertex (point) in your mesh how much it is affected by any given pivot. You could use an inverse square weighting for example, or Gaussian falloff, or a sort of 3D Voronoi, or .... Then you move the pivot points and you deform the mesh vertices based on your weight map.

If you do this for all vertices in all meshes, and your meshes are well constructed, you should never end up with gaps or unwanted intersections.

Another approach would be to use local deforms with falloff. Take 3D scaling for example. You define a center point C of the scaling operation, but the scale factor depends on distance from this base point. So the parts of the mesh that are close to C will scale a lot and parts that are far away will scale very little or not at all.

David Rutten
I've been attempting similar solutions but my math background is obviously not as strong as yours. I'm convinced this is the solution, and I think it's what the MakeHuman people have done. It's just a matter of getting a well constructed mesh (ours has some problems and we are without a professional modeler).
colithium
Here's a brief tutorial on using radial basis functions: http://cg.alexandra.dk/tag/geometry-deformation/
greyfade