3

As part of my master thesis, I need to examine the curvature of different 3D scanned objects, I am new in meshlab and meshes in general so I find it quite difficult to understand.

My meshes are irregular, because they are 3D scanned. So also the 'distribution' of vertices is irregular. Does this influence my curvature calculation? I think it does, because all the curvature calculation methods use neighbours vertices, but I am not sure. Can I compare the curvature of different meshes fairly, when their vertices are not uniformly distributed in the same way?

My solution would be to resample all the meshes in the same way, and then do a surface reconstruction and calculate the curvature?

Or am I seeing problems that are not there and can I just use the curvature calculation. (I think I will go for pseudo inverse)

I am using meshlab 2016.12

Thank you for your help!

Bas

Rockcat
  • 3,002
  • 2
  • 14
  • 28

1 Answers1

5

I don't know if you are already familiar with curvatures on a surface, so I will explain some basics concepts before of speaking about curvatures on meshlab-2016 and how to compare curvatures between two meshes.

First: The curvature on a point of a surface measures how much the surface deviates from the tangent plane on that point. This deviation may not be equal in every direction around that point. For example, any point on a side of a cylinder has zero curvature on one direction (parallel to axis) because the surface does not deviates from the plane on that direction, but has a positive curvature in any other direction.

A cylinder and a tangent plane

So "curvature on a point" take values that generally are not equal in every direction around the point. In general, there is one orientation where the curvature is maximal and other (perpendicular) where the curvature is minimal. Those are called principal curvatures

Meshlab can compute and render the principal curvatures orientation using the commands:

  • Filters -> Normals, curvatures and orientations -> Compute Curvature Principal Directions.
  • Render -> Show Curvature.

Principal curvatures of Fertility

This, being useful for understanding the concepts and complexity of representing the curvatures of a surface, is not adequate for comparing the "difference of curvatures" between two meshes. But it is a good starting point to answer your main question: Meshlab can compute curvatures on irregular meshes, and will give one value of curvature for each vertex of the mesh. Despite you probably don't know "how to compare principal curvatures", you may anticipate that your first problem will be that both meshes have different number and position for vertex, so you will know the curvatures but they will be located on different position in the surfaces.

Next. To avoid having to work with those complex "different curvature values in each direction", people usually work with two scalar values that do not depend of orientation:

  • Mean Curvature is the average value between maximal and minimal curvatures. This value will allow you to classify your vertex as being convex (MC > 0), concave (MC < 0) or "almost flat" ( MC ~ 0)
  • Gaussian Curvature is the product between maximal and minimal curvatures. Gaussian curvature will be zero if your surface is "flat" in any orientation (as the side of the cylinder example), and will allow you to classify your vertex as being elliptical (GC > 0), hyperbolic (GC < 0) or parabolic (GC ~ 0)

You can compute both values in meshlab-2016 using Filters -> Normals, curvatures and orientations -> Discrete Curvature dialog:

Mean Curvature

Gaussian Curvature

The scalar values for curvatures are stored as a Quality Value in the vertex, so you can analyze them using Render->Show Quality Histogram or save the values to a .ply file so you can use them in your own programs.

Quality histogram

So, we are now almost ready to design a "Compute curvature differences between two irregular meshes" algorithm, because now curvatures are just scalar values stored as Quality-per-Vertex. So you can:

  • Load both meshes A and B. I suppose that they are similar but different. On my example I will use a mesh with 9000 triangles and a simplification of the same mesh to 3000 triangles.
  • Compute mean/gaussian curvatures of mesh A. curvatures on mesh A
  • Use filter Sampling -> Vertex Attribute Transfer to transfer quality from mesh A to mesh B. As seen on image Transfer Quality
  • Presto! Now you have curvatures measured on mesh A stored on vertex of mesh B After Transfer Quality
  • Save mesh B to a .ply file with quality values.
  • Use filter to compute mean/gaussian curvatures for mesh B. Real curvatures for mesh B
  • Save the mesh to another .ply file with quality values.

Now, you can compare the quality stored on both files, plot the differences, etc...

Rockcat
  • 3,002
  • 2
  • 14
  • 28