π§π»βπ§πΏβπ§π½ IG Interpolate
This is the node the pack is named after β morphing embeddings, not pixels
- ipadapter
- clip_vision
- input_images1
- input_images2
- input_images3
- pos_embeds1
- pos_embeds2
- pos_embeds3
- neg_embeds
- positive_string
- negative_string
- ipadapter
- BATCH_SIZE
- FRAMES_TO_DROP
IG Interpolate is the headline act of the IG pack: it takes up to three batches of reference images, encodes them with CLIP Vision, and lerps between their embeddings frame by frame with an easing curve - handing you a long, ready-to-use sequence of per-frame IP-Adapter conditionings. It's not morphing pixels into each other. It's morphing the conditioning, so the model itself walks the space between your reference images. That's the whole point of the pack: "custom nodes to aid in the exploration of latent space."
Under the hood it's straightforward and well-built. Each input batch gets encoded by clip_vision, and the node checks the IP-Adapter's image projection to decide which embeddings to use - penultimate_hidden_states for the Plus-style models, image_embeds for the originals (it detects this by looking for keys like proj.3.weight or perceiver_resampler.proj_in.weight in the projection). For every consecutive image pair it generates transitioning_frames alpha steps, applies the easing function you picked, and lerps: (1 - eased_alpha) * embed1 + eased_alpha * embed2. Each interpolated frame is duplicated repeat_count times, and buffer duplicates of the first and last image pad both ends. The uncond side is a CLIP-encoded black image (or zeros), which is the right choice for IP-Adapter's behavior.
Inputs you'll actually set:
- ipadapter (
IPADAPTER) and clip_vision (CLIP_VISION) - loaded by any IP-Adapter loader; ComfyUI_IPAdapter_plus is the usual source. The node can also pull CLIP Vision out of the ipadapter object if you leave it unwired. - input_images1 / 2 / 3 (optional
IMAGE) - the reference batches. Wire as many as you have keyframes for; each becomes its own output. - transitioning_frames - frames between each pair of keyframes. repeat_count - how many times each generated frame repeats. interpolation - the easing:
linear,ease_in,ease_out,ease_in_out,bounce,elastic,glitchy,exponential_ease_out. buffer - pad frames at start/end.
The nine outputs are where people get lost. pos_embeds1/2/3 and neg_embeds are the interpolation sequences - those feed an IP-Adapter Apply node that drives your video sampler (AnimateDiff-era stuff is the natural home for this). positive_string and negative_string are pre-formatted keyframe prompt schedules ("frame":"prompt", lines) for the nodes that take that syntax. ipadapter passes through, BATCH_SIZE is the total frame count, and FRAMES_TO_DROP is a list of frame indices where a keyframe got duplicated - drop those when you splice the prompt schedule so text and image keyframes line up.
The honest caveats: this is an SD 1.5 / SDXL era tool. It wants IP-Adapter and a CLIP Vision model - no Flux, no downloading anything the pack itself ships; you bring the models. And it's niche enough that the pack barely registers on the usual community radar, so most of the learning happens by reading the source. The README is :).
cd ComfyUI/custom_nodes
git clone https://github.com/IDGallagher/ComfyUI-IG-Nodes
Manager works too - search "IG Interpolation Nodes". Requirements (diffusers, opencv-contrib-python, matplotlib, scikit-image) come along automatically.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| ipadapter | IPADAPTER | β | |
| clip_vision | CLIP_VISION | β | |
| transitioning_frames | INT | 10β4096 | β |
| repeat_count | INT | 11β4096 | β |
| interpolation | COMBO | 8 options: linear, ease_in, ease_out, ease_in_out, bounce, elastic, +2 | |
| buffer | INT | 00β4096 | β |
| input_images1opt | IMAGE | β | |
| input_images2opt | IMAGE | β | |
| input_images3opt | IMAGE | β | |
| positive_promptsopt | STRING | β | |
| negative_promptsopt | STRING | β |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| pos_embeds1 | EMBEDS | β |
| pos_embeds2 | EMBEDS | β |
| pos_embeds3 | EMBEDS | β |
| neg_embeds | EMBEDS | β |
| positive_string | STRING | β |
| negative_string | STRING | β |
| ipadapter | IPADAPTER | β |
| BATCH_SIZE | INT | β |
| FRAMES_TO_DROP | STRING | β |