π Gimbal Cross-Modal Bridge (Text-to-Latent)
Gimbal_CrossModalBridge and GimbalCrossModalBridge are the same node β here's how to use it
- base_latent
- conditioning
- target_vector
- origin_vector
First, settle the naming, because it'll save you a confused afternoon: Gimbal_CrossModalBridge and GimbalCrossModalBridge are the exact same class registered twice in __init__.py, and Wayfinder_CrossModalBridge is a third alias for the same code. If a workflow JSON references one and your menu shows the other, nothing is broken - pick either and move on. You're here for the actual behavior: turning a line of text into a latent-space direction you can steer with.
What it produces
Inputs: llm_instruction (a string, default empty), base_latent, and mapping_mode. Outputs: target_vector (base latent plus the text-derived offset) and origin_vector (your untouched base). The classic move is to feed target_vector into GimbalCompass_Pro as its target_latent, keep your real image latent on base_latent, and steer in Orthogonal_Projection mode so the mood changes but the subject's geometry doesn't.
There are three mapping_mode options and they behave very differently, so it's worth knowing before you type:
Keyword_Heuristics- a fixed lookup table of ~30 words (bright, dark, warm, cool, neon, cinematic, pastelβ¦) and aliases (warmerβwarm), each mapped to small per-channel offsets. It sums the signatures of every word it recognizes. Deterministic, no dependencies, but closed-vocabulary: text it doesn't know is ignored with only a console log to tell you.Embedding_Projection- takes a CLIPconditioningwith a pooled output and projects it down to your channel count with a small MLP. This is the version that deserves the "cross-modal" label. The catch: unless the pack ships trained weights for exactly your model's pooled dimension (it doesn't by default), the projector is randomly initialized, so results are more "vibes" than "calibrated."Manual_JSON- you hand it JSON like{"luminance": 0.4, "saturation": -0.2}and it applies those per-channel offsets. Fully deterministic, fully transparent, and honestly the mode I'd start with to get a feel for what each channel does.
Building a working steering chain
The README's tutorial is the right shape: take a studio render or portrait latent as base_latent, set instruction to something like "dark cool neon cyberpunk", wire the bridge's target_vector into Compass Pro's target_latent, use Orthogonal_Projection at strength 1.0β1.5, drop the result through a GimbalLatentStabilizer (Ο ~0.88), and refine in a KSampler at denoise 0.45β0.60, CFG 3.5β4.5. Keep the refinement light - over-denoising overwrites the direction you just painted in.
Installing and gotchas
Same as every Gimbal node - ComfyUI Manager β search "Gimbal-comfy" β install β restart, or git clone https://github.com/FormAndNoise/Gimbal-comfy into ComfyUI/custom_nodes. Dependencies are torch/numpy/pillow, all already bundled; nothing to download. Note the README still points at the stale form-and-noise/ComfyUI-Gimbal URL.
The most common failure is silent: you type a sentence full of words that aren't in the keyword table, get a zero delta, and conclude the node is broken. It's not broken - it's a lookup table. If nothing changes, check your console for the "no keywords found" warning and either use recognized vocabulary or switch to Manual_JSON. And keep your expectations calibrated on this one: it's a young pack with essentially zero community discussion, and Embedding_Projection is genuinely half-built. The node earns its place in a workflow for fast lighting/atmosphere iteration, not as the centerpiece of a production pipeline.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| llm_instruction | STRING | β | |
| base_latent | LATENT | β | |
| mapping_mode | COMBO | Keyword_Heuristics | 3 options: Keyword_Heuristics, Embedding_Projection, Manual_JSON |
| conditioningopt | CONDITIONING | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| target_vector | LATENT | β |
| origin_vector | LATENT | β |