Skinning weights for the hand.
This example shows how to use the skinning weights to generate a hand mesh.
for (int iHand = 0; iHand < HandTrackingMessage.N_HANDS; ++iHand)
{
Point3D[] restPositions = userMessage.RestPositions[iHand];
Matrix3D[] currentPoseTransforms = poseMessage.JointFrames[iHand];
Matrix3D[] restPoseTransforms = userMessage.RestJointFrames[iHand];
handVertices[iHand] = new VertexPositionNormalTexture[restPositions.Length];
Matrix3D[] relativeTransforms = new Matrix3D[restPoseTransforms.Length];
for (int j = 0; j < restPoseTransforms.Length; ++j)
{
relativeTransforms[j] = new Matrix3D();
relativeTransforms[j].Append(restPoseTransforms[j]);
relativeTransforms[j].Invert();
relativeTransforms[j].Append(currentPoseTransforms[j]);
}
for (int jVertex = 0; jVertex < handVertices[iHand].Length; ++jVertex)
{
Point3D restPos = restPositions[jVertex];
int[] influenceBones = userMessage.SkinningIndices[iHand][jVertex];
float[] influenceWeights = userMessage.SkinningWeights[iHand][jVertex];
int nInfluences = influenceBones.Length;
Point3D sumPoint = new Point3D(0, 0, 0);
for (int kInfluence = 0; kInfluence != nInfluences; ++kInfluence)
{
float w = influenceWeights[kInfluence];
int b = influenceBones[kInfluence];
Point3D xfPoint = relativeTransforms[b].Transform(restPositions[jVertex]);
sumPoint.X += w * xfPoint.X;
sumPoint.Y += w * xfPoint.Y;
sumPoint.Z += w * xfPoint.Z;
}
handVertices[iHand][jVertex].Position = new Vector3((float) sumPoint.X, (float) sumPoint.Y, (float) sumPoint.Z);
}
}