CoolFace
Modelpublic

Cseti/LTX2.3-22B_IC-LoRA-CrossView-Warp_v2

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
27likes
Model Card

LTX-Video 2.3 22B — IC-LoRA: CrossView Warp v2

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.

What changed since v0.9

v0.9 was a proof of concept. This version shares almost nothing with it but the idea:

v0.9**v2**
Training data548 pairs from SynCamVideo + Syn4D719 scenes I rendered myself in Blender
DepthDepth Anything V2, scale-fitted to known geometryMoGe-2, native metric — no fit
LoRA targetsattention onlyattention + feed-forward
Warp resolutiondownscale 2downscale 1 (full resolution)

Examples

<Gallery />

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.

  1. 1.Install the ComfyUI-CrossViewWarp node.
  2. 2.Depth comes from MoGe, which is a core ComfyUI node.
  3. 3.Load LTX2.3-22B_IC-LoRA-CrossView-Warp_v2_6000.safetensors as the IC-LoRA.
  4. 4.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.
  5. 5.The prompt is one word: `crossview`.
  6. 6.Set the camera on the CrossView Warp node
  7. 7.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:

AzimuthElevationWhy
Reliableup 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
Weakestbelow −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 modelLTX-Video 2.3 (22B)
Frameworkltx-trainer (Lightricks), unmodified
StrategyIC-LoRA, flexible, dual reference conditioning
Released checkpointstep 6,000
LoRA rank / alpha32 / 32
Target modulesattn1, attn2 (to_k/q/v/out.0) and ff.net.0.proj, ff.net.2
Trainable parameters163,577,856
OptimizerAdamW 2.5e-4, cosine_with_restarts, eta_min 2.5e-5, T_0 1500
Schedule6,000 optimizer steps × grad-accum 4 = 24,000 samples = 33.4 epochs
Batch1, gradient checkpointing
Precisionbf16
Resolution768×768 × 81 frames, single bucket
Referencesdepth-warp + source, both downscale_factor 1, order [warp, source]
Measured46.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](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:

![Ko-fi](https://ko-fi.com/chetyart) ![Liberapay](https://liberapay.com/chetyart/donate)