/// <summary> /// Cargar Weights de vertices /// </summary> /// <param name="meshData"></param> /// <returns></returns> private TgcSkeletalVertexWeight[] loadVerticesWeights(TgcSkeletalMeshData meshData, TgcSkeletalBone[] bones) { //Crear un array de Weights para cada uno de los vertices de la malla TgcSkeletalVertexWeight[] weights = new TgcSkeletalVertexWeight[meshData.verticesCoordinates.Length / 3]; float[] vertexWeightTotals = new float[weights.Length]; for (int i = 0; i < weights.Length; i++) { weights[i] = new TgcSkeletalVertexWeight(); vertexWeightTotals[i] = 0; } //Cargar los weights de cada vertice int weightsCount = meshData.verticesWeights.Length / 3; for (int i = 0; i < weightsCount; i++) { int vertexIdx = (int)meshData.verticesWeights[i * 3]; int boneIdx = (int)meshData.verticesWeights[i * 3 + 1]; float weightVal = meshData.verticesWeights[i * 3 + 2]; TgcSkeletalBone bone = bones[boneIdx]; TgcSkeletalVertexWeight.BoneWeight weight = new TgcSkeletalVertexWeight.BoneWeight(bone, weightVal); weights[vertexIdx].Weights.Add(weight); //acumular total de weight para ese vertice, para luego poder normalizar vertexWeightTotals[vertexIdx] += weightVal; } //Normalizar weights de cada vertice for (int i = 0; i < weights.Length; i++) { TgcSkeletalVertexWeight vertexWeight = weights[i]; float vTotal = vertexWeightTotals[i]; //Normalizar cada valor segun el total acumulado en el vertice foreach (TgcSkeletalVertexWeight.BoneWeight w in vertexWeight.Weights) { w.Weight = w.Weight / vTotal; } } return(weights); }
/// <summary> /// Cargar Weights de vertices /// </summary> /// <param name="meshData"></param> /// <returns></returns> private TgcSkeletalVertexWeight[] loadVerticesWeights(TgcSkeletalMeshData meshData, TgcSkeletalBone[] bones) { int maxWeights = 4; TgcSkeletalVertexWeight.BoneWeight.GreaterComparer weightComparer = new TgcSkeletalVertexWeight.BoneWeight.GreaterComparer(); //Crear un array de Weights para cada uno de los vertices de la malla TgcSkeletalVertexWeight[] weights = new TgcSkeletalVertexWeight[meshData.verticesCoordinates.Length / 3]; for (int i = 0; i < weights.Length; i++) { weights[i] = new TgcSkeletalVertexWeight(); } //Cargar los weights de cada vertice int weightsCount = meshData.verticesWeights.Length / 3; for (int i = 0; i < weightsCount; i++) { int vertexIdx = (int)meshData.verticesWeights[i * 3]; int boneIdx = (int)meshData.verticesWeights[i * 3 + 1]; float weightVal = meshData.verticesWeights[i * 3 + 2]; TgcSkeletalBone bone = bones[boneIdx]; TgcSkeletalVertexWeight.BoneWeight weight = new TgcSkeletalVertexWeight.BoneWeight(bone, weightVal); weights[vertexIdx].Weights.Add(weight); } //Normalizar weights de cada vertice for (int i = 0; i < weights.Length; i++) { TgcSkeletalVertexWeight vertexWeight = weights[i]; //Se soportan hasta 4 weights por vertice. Si hay mas se quitan y se reparten las influencias entre el resto de los huesos if (vertexWeight.Weights.Count > maxWeights) { //Ordenar por weight de menor a mayor y luego revertir, para que quede de mayor a menor peso vertexWeight.Weights.Sort(weightComparer); vertexWeight.Weights.Reverse(); //Quitar los ultimos los weight que superan 4 while (vertexWeight.Weights.Count > maxWeights) { vertexWeight.Weights.RemoveAt(vertexWeight.Weights.Count - 1); } } //Sumar el total de todos los weights de este vertice float weightTotal = 0; foreach (TgcSkeletalVertexWeight.BoneWeight w in vertexWeight.Weights) { weightTotal += w.Weight; } //Normalizar cada valor segun el total acumulado en el vertice foreach (TgcSkeletalVertexWeight.BoneWeight w in vertexWeight.Weights) { w.Weight = w.Weight / weightTotal; } } return weights; }
/// <summary> /// Cargar Weights de vertices /// </summary> /// <param name="meshData"></param> /// <returns></returns> private TgcSkeletalVertexWeight[] loadVerticesWeights(TgcSkeletalMeshData meshData, TgcSkeletalBone[] bones) { //Crear un array de Weights para cada uno de los vertices de la malla TgcSkeletalVertexWeight[] weights = new TgcSkeletalVertexWeight[meshData.verticesCoordinates.Length / 3]; float[] vertexWeightTotals = new float[weights.Length]; for (int i = 0; i < weights.Length; i++) { weights[i] = new TgcSkeletalVertexWeight(); vertexWeightTotals[i] = 0; } //Cargar los weights de cada vertice int weightsCount = meshData.verticesWeights.Length / 3; for (int i = 0; i < weightsCount; i++) { int vertexIdx = (int)meshData.verticesWeights[i * 3]; int boneIdx = (int)meshData.verticesWeights[i * 3 + 1]; float weightVal = meshData.verticesWeights[i * 3 + 2]; TgcSkeletalBone bone = bones[boneIdx]; TgcSkeletalVertexWeight.BoneWeight weight = new TgcSkeletalVertexWeight.BoneWeight(bone, weightVal); weights[vertexIdx].Weights.Add(weight); //acumular total de weight para ese vertice, para luego poder normalizar vertexWeightTotals[vertexIdx] += weightVal; } //Normalizar weights de cada vertice for (int i = 0; i < weights.Length; i++) { TgcSkeletalVertexWeight vertexWeight = weights[i]; float vTotal = vertexWeightTotals[i]; //Normalizar cada valor segun el total acumulado en el vertice foreach (TgcSkeletalVertexWeight.BoneWeight w in vertexWeight.Weights) { w.Weight = w.Weight / vTotal; } } return weights; }
/// <summary> /// Cargar Weights de vertices /// </summary> /// <param name="meshData"></param> /// <returns></returns> private TgcSkeletalVertexWeight[] loadVerticesWeights(TgcSkeletalMeshData meshData, TgcSkeletalBone[] bones) { int maxWeights = 4; TgcSkeletalVertexWeight.BoneWeight.GreaterComparer weightComparer = new TgcSkeletalVertexWeight.BoneWeight.GreaterComparer(); //Crear un array de Weights para cada uno de los vertices de la malla TgcSkeletalVertexWeight[] weights = new TgcSkeletalVertexWeight[meshData.verticesCoordinates.Length / 3]; for (int i = 0; i < weights.Length; i++) { weights[i] = new TgcSkeletalVertexWeight(); } //Cargar los weights de cada vertice int weightsCount = meshData.verticesWeights.Length / 3; for (int i = 0; i < weightsCount; i++) { int vertexIdx = (int)meshData.verticesWeights[i * 3]; int boneIdx = (int)meshData.verticesWeights[i * 3 + 1]; float weightVal = meshData.verticesWeights[i * 3 + 2]; TgcSkeletalBone bone = bones[boneIdx]; TgcSkeletalVertexWeight.BoneWeight weight = new TgcSkeletalVertexWeight.BoneWeight(bone, weightVal); weights[vertexIdx].Weights.Add(weight); } //Normalizar weights de cada vertice for (int i = 0; i < weights.Length; i++) { TgcSkeletalVertexWeight vertexWeight = weights[i]; //Se soportan hasta 4 weights por vertice. Si hay mas se quitan y se reparten las influencias entre el resto de los huesos if (vertexWeight.Weights.Count > maxWeights) { //Ordenar por weight de menor a mayor y luego revertir, para que quede de mayor a menor peso vertexWeight.Weights.Sort(weightComparer); vertexWeight.Weights.Reverse(); //Quitar los ultimos los weight que superan 4 while (vertexWeight.Weights.Count > maxWeights) { vertexWeight.Weights.RemoveAt(vertexWeight.Weights.Count - 1); } } //Sumar el total de todos los weights de este vertice float weightTotal = 0; foreach (TgcSkeletalVertexWeight.BoneWeight w in vertexWeight.Weights) { weightTotal += w.Weight; } //Normalizar cada valor segun el total acumulado en el vertice foreach (TgcSkeletalVertexWeight.BoneWeight w in vertexWeight.Weights) { w.Weight = w.Weight / weightTotal; } } return(weights); }