Nodes/Avatar Graph/Mesh Point Normals
ComfyUI Node

Mesh Point Normals

Faking rounded shading on a flat mesh, straight from Blender

By avatechai·Created 3 years ago·Updated 2 years ago· 264
Mesh Point Normals
  • BPY_OBJ
  • target_location
  • BPY_OBJ
mode
invertfalse
alignfalse
spherizefalse
spherize_strength0.10

If you've ever wondered how a completely flat plane can look like it's catching light like a sphere, this is the trick. Mesh Point Normals wraps Blender's bpy.ops.mesh.point_normals operator, which doesn't move a single vertex - it just re-aims the custom shading normals so lighting behaves as if the surface curved toward a point in space. It's a classic 2D-in-3D cheat: cutout art, sprite trees, flat "cards" standing in for round objects, and - relevant to why this pack has it at all - the flat character planes Avatar Graph builds from a single portrait.

How it works

Every vertex (or face corner, if you're using custom split normals) normally has its normal pointing straight out of the flat surface. This operator overrides that: instead of "straight out," each normal gets aimed at a target location, so when a light hits the mesh, it shades like a rounded surface even though the geometry is dead flat. It's the same principle games use to fake roundness on low-poly foliage and sprites.

The inputs and outputs that matter

  • mode - COORDINATES (aim at a fixed 3D point you supply) or MOUSE (aim at wherever the cursor is projected - a leftover from this being an interactive Blender tool; in a headless graph, COORDINATES is the one that actually makes sense).
  • target_location - the point the normals get pointed toward, when mode is COORDINATES.
  • invert - flips the direction, pointing normals away from the target instead of toward it.
  • align - instead of fully snapping to point-at-target, rotates the existing normal the minimum amount needed to align - a gentler version of the effect.
  • spherize and spherize_strength - blend between the mesh's original normals and the fully-pointed ones. At spherize_strength 1.0 you get the full point-normals effect; lower values ease it in, which is the more useful range if "fully spherical" looks overdone on your mesh.

Output is the same BPY_OBJ, normals modified, ready for whatever shading or export step comes next.

How to install it

Through ComfyUI Manager - search "Avatar Graph" (or avatar-graph-comfyui) and install. Manually: cd ComfyUI/custom_nodes && git clone https://github.com/avatechai/avatar-graph-comfyui, then cd avatar-graph-comfyui && pip install -r requirements.txt and restart. The real blocker isn't the clone - it's that Avatar Graph needs Python 3.10.x specifically, because bpy (Blender running as a library, not an app) only ships wheels for that exact version. If your ComfyUI environment is on 3.11 or newer, the install fails or the whole blender category of nodes just doesn't show up. On macOS/Linux the README recommends a dedicated conda env (conda create --name comfyui python=3.10); on Windows, grab Avatech's prebuilt Python-3.10 ComfyUI zip and install the pack through Manager afterward.

Common issues & troubleshooting

Nothing visibly changes. This node edits shading normals, not geometry - the silhouette stays identical. If you're checking the result by eye in a viewport with flat shading, or you never enabled custom split normals to begin with, you won't see the difference. Check under a smooth-shaded, lit render.

RuntimeError: ... poll() failed, context is incorrect. This operator is an Edit Mode tool that needs geometry selected. Avatar Graph's own chains manage that context for you, but if you're hand-wiring this node onto a BPY_OBJ that never went through a selection step upstream, Blender has nothing to apply it to.

Node isn't in the pack's own README table. It isn't - the README documents about seven higher-level nodes (Create Mesh Layer, Join Meshes, and so on); this is one of the lower-level blender-category nodes generated straight from Blender's own operator list via the pack's generate_blender_types.py script. Treat Blender's own manual entry for Point Normals as the real reference for edge cases this page doesn't cover.

Categoryblender

Inputs (7)

NameTypeDefaultDescription
BPY_OBJoptBPY_OBJ
modeoptCOMBO2 options: COORDINATES, MOUSE
invertoptBOOLEANfalse
alignoptBOOLEANfalse
target_locationoptB_VECTOR3
spherizeoptBOOLEANfalse
spherize_strengthoptFLOAT0.100–1

Outputs (1)

NameTypeDescription
BPY_OBJBPY_OBJ