Problem with clothing on character

In my application user can wear different clothes. Clothes for character are skinned meshes with bones, identical to character’s bones. Clothes should dress on a character through attaching clothes bones to character’s bones. The problem is that bones are attached, but clothes mesh worn “unevenly”, some parts of character’s body get off from clothes (see pic.1). Dressing should be processed at run-time, clothes are load from asset bundles. Please, see my code.

Start Download() function:


function StartDownload () {
	if (url.IndexOf ("file://") == 0 || url.IndexOf ("http://") == 0)
		{
		download = new WWW (url);
		}
		yield download;
	assetBundle = download.assetBundle;
	
	if (assetBundle != null)
	{
		loadedObject = assetBundle.mainAsset;
			
		if (loadedObject != null) 
		{
		instanced = Instantiate(loadedObject);
		// get all components of instanced object
		numT = instanced.GetComponentsInChildren(Transform);
		// get mesh from array of components
		objectMesh = getMesh(numT);
		// get link on SkinnedMeshRenderer
		skm = objectMesh.GetComponent("SkinnedMeshRenderer") as SkinnedMeshRenderer;
		// get link on sharedMesh from SkinnedMeshRenderer
		m = skm.sharedMesh;
		// add mesh filter
		objectMeshFilter = GameObject.Find(objectMesh.name).AddComponent(MeshFilter);
		// add current clothes mesh to mesh filter
		objectMeshFilter.mesh = m;
		// wear current clothes on girl
		wearing();
		// destroy instanced object
		Destroy(instanced);
		}
		else
			Debug.Log("Couldnt load resource");	
			}
	else
	{
		Debug.Log("Couldnt load resource");	
	}}

Wearing() function:


function wearing() {
		bonesArr = new Transform [numT.length-1];
		// we start at [1] because transform of game object itself is at [0] position
		for (i=1;i<numT.length;i++) {
		bonesArr[i-1] = numT*;*
*		}*
*		for (var b=0;b<bonesArr.length;b++) {*
<em>		bonesArr__.transform.parent = girl.Find(bonesArr**.name).transform;**__</em>
<em><strong><strong>		bonesArr__.transform.position = girl.Find(bonesArr**.name).transform.position;**__</strong></strong></em>
<em><strong><strong>__**		// if game object has renderer -> it is a mesh**__</strong></strong></em>
<em><strong><strong><strong>__		if (bonesArr**.renderer != null) {**__</strong></strong></strong></em>
<em><strong><strong><strong>__**		// bind mesh to root bone**__</strong></strong></strong></em> 
<em><strong><strong><strong><strong>__		bonesArr**.transform.parent = girl.Find("root").transform;**__</strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong>__		bonesArr**.transform.position = girl.Find("root").transform.position;**__</strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong>__**		}**__</strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong>__**		// change names of attched clothes bones**__</strong></strong></strong></strong></strong></em> 
<em><strong><strong><strong><strong><strong><strong>__		if (bonesArr**.renderer == null) {**__</strong></strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong><strong>__**		// gameObject doesnt contain mesh -> it is a bone**__</strong></strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong><strong><strong><strong>		bonesArr__.name = bonesArr**.name + objectMesh.name;**__</strong></strong></strong></strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong><strong><strong><strong>__**		}**__</strong></strong></strong></strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong><strong><strong><strong>__**		}**__</strong></strong></strong></strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong><strong><strong><strong>__**}**__</strong></strong></strong></strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong><strong><strong><strong>__**```**__</strong></strong></strong></strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong><strong><strong><strong>__**It happened that all clothing was modeled around this character, staying in a T-pose. Now, I try to dress this clothing on a character staying in another, “default” pose. Maybe, problem in it?**__</strong></strong></strong></strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong><strong><strong><strong>__**But, as I understand, if mesh rigged to bones and bones changed their positions, mesh should follow bones.**__</strong></strong></strong></strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong><strong><strong><strong>__**So, please review my code and tell me, how can I solve this problem? Perhaps, I don't understand something in mesh behaviour in Unity.**__</strong></strong></strong></strong></strong></strong></strong></strong></em>
<em><strong><strong><strong><strong><strong><strong><strong><strong><strong>**<a href="http://img45.imagehaven.net/img.php?id=S4YSKH163N_girl_skirt.jpg" target="_blank"><img border='0' src="http://img45.imagehaven.net/img/thumbs/S4YSKH163N_girl_skirt.jpg"></a>**</strong></strong></strong></strong></strong></strong></strong></strong></strong></em>

while I’m having the same problem as you are, I dont have a definite answer…but there are somethings that could help you out.

  1. I dont see where you are setting the bones you setting to the skinned mesh renderer

  2. I dont see where you are setting the bind pose or weights for your bones.

  3. if you have a skinned mesh renderer (and you do since you are trying to animate the model) you dont need the normal meshFilter… in fact, once you have a skinned mesh renderer, Unity ignores the mesh filter attached to the object.

Let me know if you solve this problem, since I need help with this too.

you could use interactive cloth and have a box collider on the bones of the shoulders or the waist. then adding a mesh collider to the body, the cloth would smoothly cover it. but this way need more processing power