1
\$\begingroup\$

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?

\$\endgroup\$

2 Answers 2

1
\$\begingroup\$

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.

\$\endgroup\$
2
  • \$\begingroup\$ 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. \$\endgroup\$
    – akhil
    Feb 27, 2013 at 23:26
  • \$\begingroup\$ @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. \$\endgroup\$
    – DaleyPaley
    May 30, 2013 at 1:21
1
\$\begingroup\$

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.

\$\endgroup\$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .