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.

  • 4
    $\begingroup$ AFAIK the normal of a point is a vector from that vertex which is pointing in the exact opposite direction of (directly away from) the object's origin. $\endgroup$ Sep 7, 2021 at 2:50
  • $\begingroup$ @ChristopherBennett so am i correct to assume that it is something like a line passing through the vertex and the object origin? $\endgroup$ Sep 7, 2021 at 3:46
  • 1
    $\begingroup$ what do you mean by "passing through". If it goes in the opposite direction of the origin, it won't pass through $\endgroup$
    – moonboots
    Sep 7, 2021 at 6:34
  • 2
    $\begingroup$ @moonboots It'd be more correct to say something like "a ray cast from the origin through the vertex", I think they were searching for the vocabulary. $\endgroup$ Sep 7, 2021 at 16:37
  • $\begingroup$ oh ok you're right $\endgroup$
    – moonboots
    Sep 7, 2021 at 16:40

2 Answers 2


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.

  • In the case of a Point Instance, on a mesh, without a previous Point Distribute, the 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:

enter image description here

  • However, if the points are Point Distributed, the 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):

enter image description here

  • If you want your points to be aligned to interpolated vertex normals, (analogous to the normals in smooth shading) as on the right, above, you have to force the interpolation yourself, creating some kind of Vertex Normal attribute of your own, and Attribute Converting it:

enter image description here

(See @Chris's answer, here.) Although the GeoNodes defaults are sensible, I personally find the grammar inconsistent, and tricky to get used to.


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.

  • $\begingroup$ Interesting...thank you for the answer $\endgroup$ Sep 7, 2021 at 8:27
  • 3
    $\begingroup$ How is the degenerate case of a solitary vertex positioned at the object's origin handled? $\endgroup$ Sep 7, 2021 at 15:40
  • 3
    $\begingroup$ @MartyFouts the normal is 0;0;0 - that is, when you have vertex normals visibility enabled, there's no blue line, and typing C.object.data.vertices[0].normal into console yields Vector((0.0, 0.0, 0.0)) i.imgur.com/J6eIaT6.gif $\endgroup$ Sep 7, 2021 at 15:48

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .