Nodes/ComfyUI-OOP/OOP Person πŸ‘€
ComfyUI Node

OOP Person πŸ‘€

The character sheet node β€” bundle gender, age, body and all your OOP parts

By 0xRavenBlackΒ·Created 2 years agoΒ·Updated about a year agoΒ· 15
OOP Person πŸ‘€
  • hair
  • eyes
  • mouth
  • clothing
  • poses
  • OOP_PERSON
β—„age25β–Ί
β—„body_shapeAverageβ–Ί
β—„ethnicityAsianβ–Ί
β—„randomizefalseβ–Ί
β—„genderβ–Ύβ–Ί

OOP Person πŸ‘€ is the node the rest of the character-building pack orbits. It takes the basic facts of a character - gender, age, body shape, ethnicity - plus the hair, eyes, mouth, clothing and pose fragments you built in the leaf nodes, and stitches them into one structured "Person:" block ready for the OOP Node πŸ’« to encode.

What it does

This one has more inputs than any other node in the pack. The required set:

  • gender - Female, Male, Androgynous.
  • age - an integer 18–120 (the slider starts at 18; the author raised it from a questionable 16 during development), default 25.
  • body_shape - 7 options: Slim, Athletic, Average, Curvy, Chubby, Hourglass, Muscular.
  • ethnicity - 6 options: African, Asian, Caucasian, Latino, Pacific, Alien.
  • randomize - unusually, this sits in the required section. When on, the node rolls a random age 16–99 for you.

The optional inputs are the custom types from the other nodes: hair (OOP_HAIR), eyes (OOP_EYES), mouth (OOP_MOUTH), clothing (OOP_CLOTHING), poses (OOP_POSE). Plug one in and its labeled string gets appended to the character block; leave it unplugged and it's omitted.

The mechanism is a neat touch: your integer age is converted into a range label. 25 becomes 20-29Years, 40 becomes 40-49Years, and so on. That's a deliberate choice - range buckets are easier for a diffusion model to hit consistently than a specific number, and it means "age 38" and "age 32" render identically. If you set randomize, the age itself is rolled between 16 and 99 each queue.

The output is a single custom OOP_PERSON string that looks like:

*  BodyShape: Athletic
*  Gender: Female
*  Age: 20-29Years
*  Ethnicity: Latino
*  Hair: color:Red, style:Ponytail
...

That block feeds the Person input on the OOP Node, which handles the actual CLIP encoding. This is also the node to reach for if you only care about people - a whole portrait workflow can be Person node β†’ OOP Node β†’ KSampler.

Installing it

It ships with the pack:

cd ComfyUI/custom_nodes
git clone https://github.com/0xRavenBlack/ComfyUI-OOP

Restart ComfyUI. Or Manager - search ComfyUI-OOP in the Custom Nodes Manager. No requirements.txt, no model files.

Gotchas

  • SDXL-era, like the rest of the pack. The OOP Node hardcodes CLIP skip βˆ’2 and 1024Γ—1024 sizing; the demo workflow is SDXL (euler/karras, cfg 8, 20 steps). Body-shape and ethnicity terms read well on SDXL and booru-trained checkpoints; treat them as weaker signal on newer encoder models.
  • randomize is in the required block. If you add this node and don't touch it, it's there and visible - just leave it unchecked for a stable character. When it's on, the age re-rolls every queue, even if you didn't change anything.
  • Age buckets flatten extremes. 18 and 19 both land in 18-19Years, 60 through 120 all become 60+Years. Fine for most purposes; not a tool for precise age control.
  • The ethnicities list is short and fixed. Six buckets, Alien included. If your character's ethnicity isn't on the list, pick the closest and hand-edit the string output.

Part of a small, dormant pack (early 2025, ~15 stars). As a way to keep character descriptions structured and repeatable across a batch - same body, same age bucket, every render - it's genuinely handy.

CategoryObject-Oriented Prompting

Inputs (10)

NameTypeDefaultDescription
ageINT2518–120β€”
body_shapeCOMBOAverage7 options: Slim, Athletic, Average, Curvy, Chubby, Hourglass, +1
ethnicityCOMBOAsian6 options: African, Asian, Caucasian, Latino, Pacific, Alien
randomizeBOOLEANfalseβ€”
genderCOMBO3 options: Female, Male, Androgynous
hairoptOOP_HAIRβ€”
eyesoptOOP_EYESβ€”
mouthoptOOP_MOUTHβ€”
clothingoptOOP_CLOTHINGβ€”
posesoptOOP_POSEβ€”

Outputs (1)

NameTypeDescription
OOP_PERSONOOP_PERSONβ€”