← All ideas
  • Published 6 Jun 2026

Vertex curvature info for GN

I really want to be able to evaluate vertex min/mean/max curvature in GN (ultimately for visualization purposes, but I could imagine other uses). Setting this up is non-trivial (but see solution in comments) and, depending on how well one understands GN, potentially very non-obvious.

I propose a new GN asset which consumes a Geometry and spits it back out along with several vertex-domain fields describing the curvature statistics; namely, the minimum, maximum and average curvatures, and also the average magnitude of curvature. For simplicity, I propose that the values should be -1 to +1, equal to cos(θ) where θ is the angle of curvature. (This is for convenience, since the angle calculation is derived from a dot product, and thus it is faster to compute the cosine, as well as likely being more useful, but I wouldn't be adverse to an option to choose between cos(θ) and θ.)

Note: Each vertex has N curvature values (hence the need to output statistics rather than 'all of them'), where N is the number of edges or faces, depending whether we are computing curvature for edges or faces. Edges are easier, and should be implemented first. Optionally, the node could allow selecting which to use.

The curvature of an edge is defined as the angle between the edge and the vertex normal. The easiest way to compute this is to take the edge direction (away from the vertex), normalize it, and take the dot product with the vertex normal. This gives values from -1 to +1, with 0 representing 'flat', positive values representing concave curvature, and negative values representing convex curvature. (Possibly the output should be inverted, since it seems more "natural" that positive would be convex and negative concave.) The curvature of a face is similar, but requires determining the unit vector which is a) on the face, b) perpendicular to the face normal, and c) coplanar with the face and vertex normals. For triangles, this isn't hard, but N-gons may introduce pathological cases.

While average curvature may be interesting on its own, "perfect" saddle points will have 0 average curvature regardless of actual curvature. This is where the min/max values are important, as they represent the maximal concavity and convexity, respectively, with saddle curvature characteristically having the greatest difference between min and max.

100%

Development Status: Open

Upvote 1 Downvote 0
mwoehlke
6 Jun 2026

2 Comments

AgentA1cr

This might make the most sense to implement as node group assets. I actually have a number of node groups I've put together for this purpose. Might wind up posting them somewhere at some point. In the meantime, the Edge Angle node is quite useful for this sort of thing.

mwoehlke Author

Yeah. Although... it took me ~4 hours starting from 'utterly clueless' to implement this in C++ (abandoned PR here ). It took 5-10x that long to get it working with existing nodes. But, yeah, it would be nice to see this as an asset.

For edge curvature, it looks like this:

nodes

Using the 'face corner angle' asset, it shouldn't be difficult to adapt this to face-corner curvature, though you'll probably get wrong results for pathological inputs (non-convex N-gons), unless FCA actually handles those correctly.

As an asset, I wouldn't bother with the option to output θ instead of cos(θ).