Unexpected normals of a curve

Hello,

I created a Bezier curve that looks like this :

Then, I converted it to a mesh, and I displayed the normal vectors at each vertex in edit mode :

What is happening here ? Looks like the normals are just vectors that point at the origin, not actual normals.
Why is that so ? What am I missing here ?

(Blender 4.0)

I should add that as soon as I extrude this shape, the normals behave as expected :

So I guess the problem comes from the fact that my mesh is a 2D curve, but why is it behaving like this ? I don’t see why the normals couldn’t be calculated like in the 3D case.

I would guess, vertex normals don’t make sense without surfaces - no way to know where to point?
Points of a curve are a different matter though. Maybe you could sample the curve normals and store them onto mesh vertices as an Attribute (in Geometry Nodes only though)… but it really depends on what you’re planning to do with them.

Yes they do, normals at vertex and faces are not the same, like we can see in the extruded case :

What prevent Blender from calculating the normals in the 2D case the same way it calculates it in the 3D case ?
And let’s admit normals in the 2D case don’t make sens (which I disagree with), why would Blender display normals at all then ?

It’s not 2D though - if it were, then it would probably be a trivial issue, yes.
But this is 3D. It doesn’t matter what it looks like - nothing tells Blender that third dimension should be excluded from the problem. Similarly, I doubt Blender has any way of knowing when not to draw a normal - the attribute is still there, even if it’s filled with some placeholder value.
If you were to fill the inner region with a face (instead of extruding), you’d wind up with a very different vertex normals - they depend on face normals.

Curves are a very specific case - they don’t branch out, they have direction, handles, tilt and who-know-what-esle. They also can be set to 2D. I imagine, they are a completely different system that is designed to make this type of calculation possible.

Of course, I’m just guessing here as I’m not an expert on geometry data structures, but I don’t think I’m far from truth.

2 Likes

Yea, but even in 3D, curve normals should still lie in the tangent plane, not go in arbitrary directions. In the capture, it’s obvious the mesh normals are pointing at the origin, to me it looks like they just don’t take into account the curve normals before conversion. I’ve never run into this because I rarely do that conversion from curve to mesh. I just tried and can confirm the resulting mesh has nonsense normals. I think I understand what is going on. @JeanGuy Since mesh normals are strictly derived data right now (meaning you can’t manipulate them, they’re always going to be calculated based on the vertex positions), perhaps there is no support for this at all, in fact. Perhaps a given mesh can’t inherit normals from its previous existence as a curve. I’m not sure

1 Like

These normals are not pointing towards the origin they are facing away from it.
So whats displayed is just the positions that got normalized. This is very likely a fallback behaviour when there are no loops( or faces) and a pure linemesh definitely has no loops.

The vertex attribute gets updated when the bmesh edit is finished.
But they need a face to be calculated, I think they get derived from the facenormals

4 Likes

Ok you guys convinced me, thx for your insights.
A simple pathological example is a straight curve mesh. Normal vectors at each point are not perfectly defined since there is an infinite number of vectors that are orthogonal to the curve.
The fact that I was expecting Blender to draw me correctly the normals comes from the fact that my curve happened to live in a 2D plane, but Blender does not see things this way of course.

Normals need faces.