THE CONTENT BELOW is outdated and useless. It will be updated in few days (not before 16/11/2016)
Motivation: Using MH bases of the whole mesh does not generate good ambient occlusion results when we decrease the number of bases in use. Thus, diving the mesh into clusters will help to get better results.
Maximum Skinning Weight: Cluster the mesh vertices depending on the maximum value of the bone weights. This scheme generates good clusters; however it will be problematic for animated meshes since it discards effect of all the bones other than the one with maximum weight. Additionally, this approach is problematic between cluster borders.
Minimum Distance: Cluster the mesh vertices depending on the distance with the bones. Here, the vertices are assigned to cluster of the closest bone. Even though this approach also creates good clusters, it suffers on the cluster borders as maximum weight approach, and discards effect of all the other bones except the closest one.
Bone Weight Clustering: This approach considers all the weights a vertex has. Effects of all the bones are considered in this approach; however, it also generates lots of small clusters having one, two, six, etc. vertices. These kinds of small clusters effect approximated ambient occlusion results, and generates wrong results when number of the bases is decreased.
We need clusters depending on more than one bone and yet including reasonable number of vertices. If we consider all the bones effect on a vertex, we can face with some bone weights such as 0.003 and 0.001 with a weight 0.996. Considering these kinds of small weights only generates small clusters tending to generate wrong results. So, we will going to add a user defined threshold that eliminates effect of bones with small weights on the vertices.
---Threshold Clustering Algorithm---
THRESHOLD ϵ [0, 1]
for i = 0 to N // For each vertex in the mesh
for j = 0 to M // For each bone weight
if Wj > THRESHOLD
- Add the bone index j into the list
if there is a cluster including the same bone indices
// Add the vertex into that cluster
// Generate a new cluster with the bone indices
// Add that cluster into cluster set
Experiments with Threshold Clustering
For now, we used a hand model with 5406 vertices (figure 1).
Experiment with the threshold showed that the best threshold value for this mesh is 0.11. By using this threshold, we are eliminating small clusters (size(clusteri)) > 20 for each clusters), keep enough number of bones to affect, and good cluster locations for decreasing MH bases (figure 2 and figure 3).
Even though using a threshold solves many problems, there are still problems on the borders between clusters (figure 4). However, this approach is more promising to get better results among the other approaches. Especially, for the big clusters with uniform ambient occlusion (such as wrist), we are able to decrease the number of bases more than 90%.
Also, for some parts (such as between fingers), we are able to decrease the number of bases around 50% (figure 5 and figure 6).
For the nails, even though there is no such problems as figure 4, we begin to lose some details when we use less than 80% of the bases (figure 7).