Game Development Stack Exchange is a question and answer site for professional and independent game developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am working on the generation of Hexahedral mesh generation using octree based discretization. I have a volume mesh (Hexahedral), using isomorphism I need to project the outermost surface vertices of inner mesh onto original mesh. Could anyone help me on how to extract the surface of inner mesh?

share|improve this question

I think the term you are looking for "Surface nets".

In Surface nets, instead of doing an exact projection onto the mesh surface, an filtering-based approximation is used. For example, in this paper, they use an iterative smoothing process, that keeps all vertices in their original volume boundary.

share|improve this answer
Hello Jimmy,Thank you for your response. But, I am looking to find a way to extract the outter most surface of inner mesh. I really appreciate your post. But, I am not looking for smoothing methods. – akhil Feb 27 '13 at 23:26
@akhil I think you may have misunderstood what surface nets are. They are not simply a smoothing method. They are a way to polygonise an implicit surface by building a mesh out voxel edges and then projecting the vertices onto the actual surface. The only difference to your problem is that surface nets create a manifold mesh, not a hexahedral one, but the basic principle is the same. So when you talk of projecting the surface of the inner mesh onto the actual surface, it is EXACTLY what you want. – DaleyPaley May 30 '13 at 1:21

I think you need to create a signed distance field based on the original mesh. Then you can use gradient descent to iteratively move the outer vertices along the gradient of the distance field towards the orginal mesh surface.

The gradient of a scalar field can be constructed like this:

float getFieldAtPosition(vec3 _Pos) {
    return ... <- return value of signed distance function

vec3 getGradientAtPosition(vec3 _Pos) {
    float epsilon = 0.01; // small offset
    vec3 gradient;
    gradient.x = getFieldAtPosition(_Pos+vec(epsilon,0,0)) - getFieldAtPosition(_Pos-vec(epsilon,0,0));
    gradient.y = getFieldAtPosition(_Pos+vec(0,epsilon,0)) - getFieldAtPosition(_Pos-vec(0,epsilon,0));
    gradient.z = getFieldAtPosition(_Pos+vec(0,0,epsilon)) - getFieldAtPosition(_Pos-vec(0,0,epsilon));
    return gradient;

Hope that helps.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.