public void addBone(int vertexID, int JointId, float force)
            {
                BoneVertex vertex = BoneVertexList[vertexID];

                vertex.addBone(JointId, force);
                BoneVertexList[vertexID] = vertex;
            }
            public void BuilSkin()
            {
                for (int i = 0; i < BoneVertexList.Count; i++)
                {
                    BoneVertex vertex        = BoneVertexList[i];
                    var        wight         = new BoneWeight();
                    float      len           = 0;
                    var        orderdWeights = vertex.bones.OrderByDescending(t => t.Weight).ToList();
                    switch (orderdWeights.Count)
                    {
                    case 0:
                        break;

                    case 1:
                        wight.boneIndex0 = orderdWeights[0].BoneIndex;
                        wight.weight0    = orderdWeights[0].Weight;
                        break;

                    case 2:
                        wight.boneIndex0 = orderdWeights[0].BoneIndex;
                        wight.boneIndex1 = orderdWeights[1].BoneIndex;
                        len = Mathf.Sqrt(orderdWeights[0].Weight * orderdWeights[0].Weight +
                                         orderdWeights[1].Weight * orderdWeights[1].Weight);
                        wight.weight0 = orderdWeights[0].Weight / len;
                        wight.weight1 = orderdWeights[1].Weight / len;
                        break;

                    case 3:

                        wight.boneIndex0 = orderdWeights[0].BoneIndex;
                        wight.boneIndex1 = orderdWeights[1].BoneIndex;
                        wight.boneIndex2 = orderdWeights[2].BoneIndex;

                        len = Mathf.Sqrt(orderdWeights[0].Weight * orderdWeights[0].Weight +
                                         orderdWeights[1].Weight * orderdWeights[1].Weight +
                                         orderdWeights[2].Weight * orderdWeights[2].Weight);
                        wight.weight0 = orderdWeights[0].Weight / len;
                        wight.weight1 = orderdWeights[1].Weight / len;
                        wight.weight2 = orderdWeights[2].Weight / len;
                        break;

                    default:
                        wight.boneIndex0 = orderdWeights[0].BoneIndex;
                        wight.boneIndex1 = orderdWeights[1].BoneIndex;
                        wight.boneIndex2 = orderdWeights[2].BoneIndex;
                        wight.boneIndex3 = orderdWeights[3].BoneIndex;

                        len = Mathf.Sqrt(orderdWeights[0].Weight * orderdWeights[0].Weight +
                                         orderdWeights[1].Weight * orderdWeights[1].Weight +
                                         orderdWeights[2].Weight * orderdWeights[2].Weight +
                                         orderdWeights[3].Weight * orderdWeights[3].Weight);
                        wight.weight0 = orderdWeights[0].Weight / len;
                        wight.weight1 = orderdWeights[1].Weight / len;
                        wight.weight2 = orderdWeights[2].Weight / len;
                        wight.weight3 = orderdWeights[3].Weight / len;

                        break;
                    }
                    maxBones = Math.Max(maxBones, vertex.numbones);

                    trace("----------");
                    trace(" ");
                    trace(string.Format(" vertex:{0} num Bones:{1} force {2}", i, vertex.numbones, len));

                    trace(string.Format(" bone index :{0}  w:{1}", wight.boneIndex0, wight.weight0));
                    trace(string.Format(" bone index :{0}  w:{1}", wight.boneIndex1, wight.weight1));
                    trace(string.Format(" bone index :{0}  w:{1}", wight.boneIndex2, wight.weight2));
                    trace(string.Format(" bone index :{0}  w:{1}", wight.boneIndex3, wight.weight3));

                    boneWeightsList.Add(wight);
                }
            }