Give it a video and a camera offset — azimuth, elevation, distance — and it
generates the same scene from that new viewpoint.
It is an IC-LoRA for LTX-Video. It reads two reference videos: a
depth-warp of your clip, which carries the geometry, and the clip itself, which
carries the identity. The warp comes from the
CrossViewWarp ComfyUI node.
The offset doesn't have to be one fixed pose. The node's 3D orbit picker takes
keyframes and interpolates a camera pose per frame, so you can drive a whole
camera move, not just a new static viewpoint.
v0.9 was a
proof of concept. This version shares almost nothing with it but the idea:
Usage (ComfyUI)
There is a ready-made graph —
ltx2.3-ic-lora-crossview-warp-v2.json
— which is the workflow the gallery clips were generated with. Load that and you
only need to point it at your own video and set the camera. The steps below are
what it wires up, in case you are building your own.
- Install the
ComfyUI-CrossViewWarp
node.
- Depth comes from MoGe, which is a core ComfyUI node.
- Load
LTX2.3-22B_IC-LoRA-CrossView-Warp_v2_6000.safetensors as the IC-LoRA.
- Wire your clip to both an IC-LoRA reference guide and the CrossViewWarp
node. The node's
warp output goes to the other guide. Set
latent_downscale_factor = 1 on both.
- The prompt is one word:
crossview.
- Set the camera on the CrossView Warp node
- If the effect of the LoRA is weak, increase the LoRA strength to 1.2-1.3.
Angle range
How far you can push the camera, and how much I'd trust each range:
| Azimuth | Elevation | Why |
|---|
| Reliable | up to ±45° | −20° to +30° | evenly represented in training, and the range I swept properly |
| Usable | ±45° to ±90° | +30° to +40° | in the data but not systematically tested |
| Weakest | — | below −20° | 22 of 719 scenes. Looking up at a subject is the direction the data starves |
Training
Trained on
RunPod cloud GPUs — NVIDIA RTX PRO
6000 Blackwell, 96 GB.
| |
|---|
| Base model | LTX-Video 2.3 (22B) |
| Framework | ltx-trainer (Lightricks), unmodified |
| Strategy | IC-LoRA, flexible, dual reference conditioning |
| Released checkpoint | step 6,000 |
| LoRA rank / alpha | 32 / 32 |
| Target modules | attn1, attn2 (to_k/q/v/out.0) and ff.net.0.proj, ff.net.2 |
| Trainable parameters | 163,577,856 |
| Optimizer | AdamW 2.5e-4, cosine_with_restarts, eta_min 2.5e-5, T_0 1500 |
| Schedule | 6,000 optimizer steps × grad-accum 4 = 24,000 samples = 33.4 epochs |
| Batch | 1, gradient checkpointing |
| Precision | bf16 |
| Resolution | 768×768 × 81 frames, single bucket |
| References | depth-warp + source, both downscale_factor 1, order [warp, source] |
| Measured | 46.85 s/step, ~86 h, 65.4 of 95.6 GB peak |
Dataset
719 scenes, rendered in Blender 4.2 . I rendered 978, 772 passed the
quality gates, and 719 survived a cap of 130 scenes per azimuth band.
Each sample is a source view, a target view from a second camera, and a
depth-warp of the source into the target's pose as the geometric conditioning.
The warps use MoGe-2 ViT-L metric depth.
Limitations
- It steers the viewpoint, it doesn't reproject it. It treats the warp as a
suggestion and regenerates the frame, so even parts that were perfectly visible
in your clip come back redrawn rather than copied.
You often get less rotation than you asked for, and
at large angles most of what you see is invented rather than recovered from
your footage.
- Distance barely moves in the training data. A big pull-back is outside
anything the model saw, and it will under-deliver.
This is the one place a prompt earns its keep: describe the clothing and
background the wider frame should reveal.
- Looking up from below is the weak axis. 3.1% of the training scenes.
pivot_z has to be found per clip
License
The LoRA weights in this repository are released under the Apache License
2.0.
They were trained on 719 scenes I rendered myself. Those renders contain
third-party assets — CC-BY 3D models, CC0 HDRIs and textures, and CMU motion
capture. Every one is listed in
ATTRIBUTION.md.
Using this LoRA requires the LTX-Video base model, governed by
Lightricks' own terms — review those separately. Building the conditioning
requires MoGe-2.
Support
Everything here is open, and the GPUs behind it are rented. If this was useful,
please consider supporting my work: