Computing curve skeletons of 3D shapes is an important tool in computer graphics with many different applications for shape analysis, shape matching, character skeleton construction, rigging and many more. It’s an active field of research and over the years, numerous algorithms have been developed. Most of these algorithms are based on mesh contraction using smoothing or thinning. Another popular approach is to use the voronoi diagram generated by the points of the mesh. Quite an interesting alternative, however, is to rely on spectral analysis for computing the skeleton. The idea is fairly simple and works as follows:

Compute the first non-zero eigenvector of the Laplace-Beltrami operator, namely the Fiedler vector.

Amazing!
I have wanted to solve this problem for such a long time, of creating an automated “skeleton”, but never understood how to implement it.

“Compute the first non-zero eigenvector of the Laplace-Beltrami operator, namely the Fiedler vector”

Would you need special libraries for this step or is it possible to use houdini vex/volume combinations to create the Fiedler vector field?
As I understand Laplace-Beltrami operations is just computing the Laplacian of the geometry. Would it be possible to use the Laplacian field from the VDB analysis and later use it to get the first non-zero eigenvector ?
My math knowledge is limited, I have looked at the eigenvalues and eigenvectors, but I find it difficult to understand how to use them practically, on actual geometry.

Sorry for the late reply, but I didn’t check the blog for a long time.
Well, in theory you could do the eigendecomposition with VEX and standard SOPs but it would be cumbersome and probably tremendously slow. However, you won’t need external libraries if you have access to the HDK.
Generally it’s not really common practice to use the Fiedler vector for skeleton extraction. It’s a nice idea but in practise this might lead to a number of problems because computing the Laplacian is very sensitive to irregular geometries. Most probably you might be better off by using a mesh contraction algorithm. This could be done directly on the mesh but it’s easier to use a VDB volume instead and simply relying on its gradient. I think there is a file somewhere on OdForce or the SideFx forum which is using this method.
Alternatively you could also search for the points at which the magnitude of the gradient vanishes instead of iteratively contracting the mesh. These points lie on the medial axis and could be used afterwards to compute the skeleton.

Wow, this is super useful!

May I have a file to study?

LikeLike

Unfortunately I can’t share the file but I’m always willing to help if you’re going for an implementation.

LikeLike

Is it possible to generate the countour/isolines from Houdini’s built-in tools, or is that also custom-made? Thanks!

LikeLike

It’s just standard SOPs and a bunch of wrangles. I’ve attached an example file.

https://drive.google.com/open?id=0By9c7CX4X0HAaXZUS0JvQy1oN2s

LikeLike

Ah, that’s very helpful, thank you!

LikeLike

Amazing!

I have wanted to solve this problem for such a long time, of creating an automated “skeleton”, but never understood how to implement it.

“Compute the first non-zero eigenvector of the Laplace-Beltrami operator, namely the Fiedler vector”

Would you need special libraries for this step or is it possible to use houdini vex/volume combinations to create the Fiedler vector field?

As I understand Laplace-Beltrami operations is just computing the Laplacian of the geometry. Would it be possible to use the Laplacian field from the VDB analysis and later use it to get the first non-zero eigenvector ?

My math knowledge is limited, I have looked at the eigenvalues and eigenvectors, but I find it difficult to understand how to use them practically, on actual geometry.

Any help is greatly appreciated!

LikeLike

Sorry for the late reply, but I didn’t check the blog for a long time.

Well, in theory you could do the eigendecomposition with VEX and standard SOPs but it would be cumbersome and probably tremendously slow. However, you won’t need external libraries if you have access to the HDK.

Generally it’s not really common practice to use the Fiedler vector for skeleton extraction. It’s a nice idea but in practise this might lead to a number of problems because computing the Laplacian is very sensitive to irregular geometries. Most probably you might be better off by using a mesh contraction algorithm. This could be done directly on the mesh but it’s easier to use a VDB volume instead and simply relying on its gradient. I think there is a file somewhere on OdForce or the SideFx forum which is using this method.

Alternatively you could also search for the points at which the magnitude of the gradient vanishes instead of iteratively contracting the mesh. These points lie on the medial axis and could be used afterwards to compute the skeleton.

LikeLike