๐ท Compute Curvature (RDAWG)
Measure how bendy a mesh is, per vertex
- mesh
- mesh
- curvature
- info
Curvature is the geometric answer to "how much does this surface bend here?" A flat wall has near-zero curvature; a sphere's tip has high curvature. RDAWG3DComputeCurvature computes a per-vertex curvature value for your mesh and hands it back as a tensor - which is exactly the kind of signal you want for edge detection, feature finding, segmentation, or deciding where a mesh is too dense or too smooth.
It's an analysis-flavored node, but it's categorized as processing because it can sit in the middle of a workflow: it returns the mesh unchanged plus the curvature tensor, so you can branch off the curvature for downstream logic while still flowing the mesh forward.
How it works
Open3D doesn't ship a built-in mesh curvature function, so this node estimates it - and it's honest about that in the code. All three methods work in a local neighborhood defined by radius:
- mean - looks at each vertex's neighbors within
radius, measures how much their normals differ from the vertex's own normal, and averages that. High values = the surface bends sharply around that vertex. - gaussian - sums the angles at each vertex's incident triangles and computes
(2ฯ โ angle sum) / count. Captures how "dome-like" vs. "saddle-like" the local surface is. - principal - builds a covariance matrix of local normals and takes its dominant eigenvalue, a rough stand-in for principal-curvature magnitude.
The per-vertex values are minโmax normalized into 0โ1, so you get a relative "how bendy vs. how flat" score per vertex rather than true physical curvature units. That's fine for the practical uses - it's a feature map, not a CAD measurement.
The inputs that matter
- curvature_type -
meanis the sensible default. - radius - the neighborhood size for the estimate, 0.01โ1.0, default 0.1. Scale-dependent like every spatial parameter in this pack: smaller radius = more local detail, and noise.
Outputs: mesh (the same mesh, passed through), curvature (TENSOR, one value per vertex), and info (STRING) with min/max/mean.
Install
Part of the RDAWG 3D Pack. ComfyUI Manager (search "RDAWG 3D Pack (CUDA 12.8 + PyTorch 2.9.0)") or:
cd ComfyUI/custom_nodes
git clone https://github.com/rdawgemfl/rdawg_3D_pack
cd rdawg_3D_pack
python install.py
Open3D 0.19.0+ is required - the pack won't import without it (pip install open3d>=0.19.0). Python 3.11 recommended. Watch the installer's torch 2.9.0+cu128 pin if you already have a working install.
Where people get burned
- Interpreting it as true curvature - the values are normalized estimates, not physical curvature. Don't compare them across different meshes with different
radiussettings; use them within one mesh. - Scale mismatch - a
radiusthat's huge relative to your model averages everything flat; one that's tiny amplifies noise. Normalize the model first, then tune. - Slow on big meshes - the per-vertex radius search is a real loop over the KD-tree. Million-vertex meshes will feel it; simplify first if it's dragging.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| mesh | MESH | โ | |
| curvature_type | COMBO | mean | 3 options: mean, gaussian, principal |
| radius | FLOAT | 0.100.01โ1 | โ |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| mesh | MESH | โ |
| curvature | TENSOR | โ |
| info | STRING | โ |