I know what is the normal of a plane/face, but what does it mean when the domain of the normal is a point?
For some context: I'm watching this tutorial; at the timestamp 12:30, he multiplies the normal of the points with another attribute.
I know what is the normal of a plane/face, but what does it mean when the domain of the normal is a point?
For some context: I'm watching this tutorial; at the timestamp 12:30, he multiplies the normal of the points with another attribute.
Wikipedia about a normal:
In geometry, a normal is an object such as a line, ray, or vector that is perpendicular to a given object.
Wikipedia about a vertex normal:
In the geometry of computer graphics, a vertex normal at a vertex of a polyhedron is a directional vector associated with a vertex, intended as a replacement to the true geometric normal of the surface. Commonly, it is computed as the normalized average of the surface normals of the faces that contain that vertex.
A vertex not contributing to any face could have a vertex normal of 0;0;0, however Blender devs decided to assign some more meaningful value to it. As pointed out by Christopher, it's pointing directly away from the object's origin. Since a normal consists of just 3 values, describing offsets on each of the axes, it doesn't contain an information on its origin; a vector doesn't say "go from here to there", rather "move by that amount" without specifying where to start. This means that rather than thinking of this vector in the way described by Christopher, you can also think of it as a line going from origin towards the vertex - and if the vertex is closer than 1 unit (1 meter by default) away from the origin, indeed as a line starting at the origin and passing through the vertex:
Since correct vectors are normalized (being normalized has otherwise nothing to do with normals, it just means being of length = 1), if you normalize the position of your vertex (for example by exiting Edit Mode and pasting C.object.data.vertices[0].co.normalize() in the console) so that it's exactly 1 unit away from the origin, its normal and location will be the same (if you compare using == in console, you might get False as a result due to floating point errors or otherwise slight calculation inaccuracies).
A vertex on coordinates 0;0;0 (origin), has also normal 0;0;0.
C.object.data.vertices[0].normal into console yields Vector((0.0, 0.0, 0.0)) https://i.imgur.com/J6eIaT6.gif
– Markus von Broady
Sep 07 '21 at 15:48
Just to expand on @Markus' very nice answer, specifically to Geometry Nodes.
In the current state of Geometry Nodes (Blender 3.0a), the built-in normal attribute is:
[The] Normal of a face. This is a bit different from the other built-in attributes in that it cannot be modified. It is automatically derived from the mesh. If this attribute is accessed on non-face domains, it might not be normalized, because it is interpolated from normals of neighboring faces.
Points are taken to be the mesh vertices, and, if the instances are aligned to normal, that normal is automatically interpolated from the adjacent faces. This is a Vertex Normal:normal is
picked up straight from the Face domain without interpolation, and so the Point normal is the normal of the underlying face...(left, below):(See @Chris's answer, here.) Although the GeoNodes defaults are sensible, I personally find the grammar inconsistent, and tricky to get used to.