Nodes/ComfyUI-RefCap/H3 RefCap Orbit Views
ComfyUI Node

H3 RefCap Orbit Views

One photo in, a turnaround out

By AEmotionStudio·Created about 17 hours ago·Updated about 17 hours ago· 1
H3 RefCap Orbit Views
  • left
  • right
  • views
  • yaws
◄yaws►
◄measure▾►

The problem: you have a photo, not a photoshoot

Everything else in this pack assumes you already have angles. Most people have one good photo of a face, front-on, and that's it. A character built from a single frontal reference gets invented from behind, and the invention changes every render.

H3 RefCap Orbit Views closes that gap by using H3 against itself. You render two orbits round the character - one past each side, each running from the front to directly behind - and this node picks the frame nearest each angle you want, tagging it with the angle it was actually seen from. Feed those to H3 RefCap Build View Set and you have a 24-view turnaround from one photo, in one queue. The pack's H3 RefCap 8 - Photo to RefCap template does the whole thing in about eight minutes.

Same node handles locations. Two camera pans round a room, measure = motion, and you have a location view set - the pack's H3 RefCap 9 - Location template.

Why it can't just take every twelfth frame

Because H3's orbits and pans ease in. They accelerate out of the first frame and settle at the end, so frame index is a horrible proxy for angle: the author measured frames asked for 30° reading as 5° actual. Slice a clip evenly and your "90° profile" is really a three-quarter shot, your yaws are fiction, and Replay View Set's nearest mode confidently picks the wrong picture.

So the node measures instead of counting. Three options, and the tooltips tell you which is which:

  • faces - insightface's measured head yaw, for orbits round a person. It runs buffalo_l on the CPU, takes the largest face per frame, and uses the pose's yaw. Where insightface is reliable (inside ±75°) the measurement is used directly; beyond that the yaw saturates - frames asked for 120–135° read 78–89° - so a straight line runs from the last reliable frame to 180° at the final frame, which the orbit prompts end on.
  • motion - phase correlation between neighbouring frames, summed and scaled to 180 at the last frame. This is the one for camera pans round a place, where there are no faces to measure.
  • steady - assume a straight 0→180 turn. Honest about being wrong when the easing is real, useful as a sanity check.

Inputs and outputs

  • left - frames of an orbit that turns from the front round the subject's left side to directly behind.
  • right - the same round the subject's right side. Both are required, and they're what make the full 360° turnaround possible: each clip covers 180°.
  • yaws - the angles to take, comma-separated degrees, negative for the left orbit. Empty means every 15° round the head, which produces 24 views - that's where the 24-view turnaround comes from.
  • measure - faces, motion or steady, as above.

Two outputs, and they're a matched pair: views (an IMAGE batch) and yaws (a comma-separated STRING). Wire views into Build View Set's views and yaws into its yaws, or the yaws you just measured get thrown away and replaced with even spacing. That wiring mistake is the whole node silently doing nothing.

Frames are quantised to 8-bit on the way out - the same thing you'd get from saving them - so Build View Set can store them as compact PNG sources.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/AEmotionStudio/ComfyUI-RefCap.git

Manager install works. The pack has no requirements file; faces is the one exception, and it's an optional import made inside that branch only:

pip install insightface

First use downloads buffalo_l (~300 MB) into ComfyUI/models/insightface/. Note the licence: buffalo_l is non-commercial research use. If you're shipping commercial work, that matters, and motion and steady need nothing extra. You also need the H3 model stack for the orbits themselves - int8 ref2va DiT, Qwen3-VL-32B encoder, video VAE - and H3's own licence excludes the US, EU, UK and South Korea.

Where it breaks

"the pan doesn't move: no sideways motion between its frames" - with measure = motion on a clip that barely translates. It's usually the wrong clip, or a pan rendered too slowly. There's no angle information to extract, and the node says so instead of inventing some.

ImportError on faces - insightface isn't installed in the Python environment ComfyUI actually runs. That's the only dependency this pack has, and it's the only place it's needed.

Faces that aren't faces. faces picks the largest detection. A character with a hand over their face, a helmet, or a shot where the head is small in frame gives you None for those frames, which the interpolation papers over - and if most frames fail, the yaws it hands you are a straight line dressed up as measurements. Look at the views output before you build a view set from it.

The orbits themselves. Both clips must start at the front and end behind for the measurement to make sense. That's a prompt problem, not a node problem, but it's the failure that produces a plausible-looking view set full of the wrong angles.

Categoryadvanced/refcap

Inputs (4)

NameTypeDefaultDescription
leftIMAGEframes of an orbit that turns from the front round the subject's left side to directly behind
rightIMAGEthe same round the subject's right side
yawsSTRINGangles to take, comma-separated degrees (negative: the left orbit). Empty: every 15 degrees round the head
measureCOMBOhow each frame's angle is found (H3's orbits and pans ease in, so frame position is a poor guide). faces: insightface's measured head yaw, for orbits round a person. motion: the image's sideways motion, for camera pans round a place. steady: assume a steady turn from 0 to 180

Outputs (2)

NameTypeDescription
viewsIMAGE—
yawsSTRING—