Blender Geometry Nodes: Align Instances to Normals

This guide explains how to properly align instanced objects to the surface normals of a target mesh using Blender's Geometry Nodes. By utilizing the built-in normal data from point distribution along with the Align Euler to Vector node, you can ensure that scattered objects like trees, rocks, or debris naturally orient themselves perpendicular to any curved or uneven surface.

Step 1: Set Up the Base Geometry Nodes Tree

  1. Select your target mesh and navigate to the Geometry Nodes workspace.
  2. Click New to create a new Geometry Node modifier.
  3. Disconnect or split the line between the Group Input and Group Output nodes.

Step 2: Distribute Points on the Surface

  1. Press Shift + A and add a Distribute Points on Faces node.
  2. Connect the Geometry output of the Group Input node to the Mesh input of the Distribute Points on Faces node.
  3. Choose either Random or Poisson Disk distribution depending on your spacing needs.

Step 3: Instance Objects on the Points

  1. Add an Instance on Points node.
  2. Connect the Points output of the Distribute Points on Faces node to the Points input of the Instance on Points node.
  3. Bring your asset into the node tree using an Object Info or Collection Info node.
  4. Connect the Geometry or Instances output of the asset node into the Instance input of the Instance on Points node.
  5. Connect the Instances output of the Instance on Points node to the Group Output node (or use a Join Geometry node if you want to keep the original surface visible).

Step 4: Align Rotation to Surface Normals

To give instances the correct orientation based on surface normals, use an alignment node:

  1. Add an Align Euler to Vector node (Shift + A > Utilities > Rotation > Align Euler to Vector).
  2. Connect the Normal output from the Distribute Points on Faces node into the Vector input of the Align Euler to Vector node.
  3. Connect the Rotation output of the Align Euler to Vector node to the Rotation input of the Instance on Points node.

Step 5: Configure Alignment Settings

  • Axis: Set this to the axis of your original source object that should point outward from the surface (typically Z for objects standing upright).
  • Pivot: Set this to Auto (or specify an axis if you want to restrict rotation).

Optional: Adding Random Local Rotation

To prevent all instances from facing the exact same direction while maintaining normal alignment:

  1. Add a Rotate Euler node between the Align Euler to Vector node and the Instance on Points node.
  2. Set the mode to Axis Angle or Euler, and switch the type to Local.
  3. Add a Random Value node (set to Float), set the range from 0 to tau (or 6.283), and connect it to the Z rotation axis to introduce random spin around the surface normal.