wikillm

Paper · 2025-11-27 · cs.CV

WorldWander: Bridging Egocentric and Exocentric Worlds in Video Generation

WorldWander fine-tunes the Wan2.2-5B video diffusion transformer with LoRA (rank 80) to translate video between egocentric and exocentric views. Source and target share one backbone via token concatenation, and the target reuses the source's frame positions. Trained on the authors' EgoExo-8K triplets, it reports the best LPIPS, SSIM, FVD and VBench values in its main table (author-reported).

Video generationFlow matchingLow-rank adaptation (LoRA and variants)Positional encodingvideo-generationegocentric-exocentricvideo-diffusion-transformerloradataset

arXivPDFCodeMarkdown12 min read

AI-compiled by claude-haiku-5-5 on 2026-11-06, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.

In plain words

Video generators can now make a camera move freely through a scene. A useful next step is switching viewpoint: take a clip filmed from a person's own eyes (first-person, egocentric) and produce the same moment seen from outside (third-person, exocentric), or the reverse. Earlier work mostly handled one direction and assumed a fixed outside camera.

WorldWander takes a pretrained video generator and teaches it, with a small add-on, to do this from example pairs instead of from camera geometry. The source clip and the clip being generated go through the same model as one combined input, and the model is told that matching moments in the two clips share a time position. For the reverse direction, a picture of the character is added to the input so the character stays the same. The training pairs were recorded in a video game and with a camera rig carried by a person.

This matters for games, embodied AI and VR, where a viewer or an agent needs to move between these two viewpoints.

TL;DR

  • WorldWander is a LoRA fine-tune of the Wan2.2-5B video diffusion transformer for egocentric and exocentric video translation §4 §5.1.
  • It takes a source video and, for the exo-view direction, a reference image of the character. It uses no camera poses and no depth §4.1.
  • Two mechanisms do the work: token concatenation with shared projections, and shared temporal positions for source and target §4.2 §4.3.
  • Training data is EgoExo-8K: about 4,000 synthetic (GTA-5) and about 4,000 real-world triplets §4.5 app. B.
  • The authors report better scores than four baselines on 50-triplet test sets per domain §5.2 tab. 1. The code has no license file (cite only).

Problem

Existing ego-to-exo or exo-to-ego methods work in one direction only, and mostly with static cameras, so they struggle to keep appearance, motion and environment in sync when the camera moves §1. Generating an exocentric view from an egocentric clip plus a reference image is largely unexplored §1. Three obstacles are named: synchronising the two views, keeping the character consistent across views, and the lack of paired data with moving cameras §1.

Method

The task takes triplets of an egocentric video, an exocentric video and a reference image §4.1. Two directions are trained:

  • Exo-to-ego: the exocentric video is the condition; the egocentric video is generated §4.1.
  • Ego-to-exo: the egocentric video and the reference image are the conditions; the exocentric video is generated §4.1.

No camera pose or depth input is used §4.1.

Backbone. The model is Wan2.2-5B, fine-tuned with LoRA in attention layers §3 §4.4 §5.1. The flow-matching loss in eq. 2 is used, with the forward path of eq. 1 and velocity target v = ε − z₀ eq. 2 §3.

In-Context Perspective Alignment §4.2. Three parts:

  1. Shared latent space. One VAE encodes the ego video, the exo video and the reference image into one latent space, so no condition encoder is added eq. 5 §4.2.
  2. Different noise levels. The target latent is noised along the flow path. Clean conditions are not noised. The timestep of a clean condition is 0, and the target keeps its sampled t §4.2.
  3. Collaborative attention. The clean condition(s) and the noisy target are concatenated along the token dimension into one sequence eq. 6. Self-attention over this sequence uses one set of projection matrices for all parts eq. 7 §4.2. The paper reports that this converges faster than concatenating the latents along the channel dimension fig. 3 §4.2.

Collaborative Position Encoding §4.3. Rotary positions are applied to Q and K per token eq. 4. Uniform encoding over the whole sequence breaks the frame-by-frame alignment between conditions and target. Instead, the conditional and target latents are encoded separately and given the same temporal positions eq. 8 §4.3. The paper's ablation finds this better than uniform encoding tab. 2 §5.4.

Reference image. In ego-to-exo, the reference image is encoded like a single frame and kept clean. It occupies its own slot in the sequence before the egocentric condition eq. 6 §4.2.

Training objective. The flow-matching loss eq. 2 is applied to the target tokens. Only LoRA parameters are updated §4.4.

EgoExo-8K §4.5 app. B. Synthetic: GTA-5 with two players. One plays the character from the first-person view; the other records the same scene in spectator mode. A character photo serves as the reference. More than 400 paired sequences of over one minute were cut into 5-second clips of 300 frames, giving 4,000 triplets. Real-world: a participant carried a head-mounted action camera (egocentric) and a rear-mounted panoramic camera (exocentric). The reference image is a frame sampled from the exocentric video. More than 10 hours of paired video yielded 4,000 triplets.

Fine-tuning per domain. The authors fine-tune separately for the synthetic and real-world domains, holding out 50 triplets from each as the test set §5.1.

Training step (paper form)

Pseudocode
# Training step for one triplet  [§4.2] [eq. 1] [eq. 2] [eq. 5]
# Input:  source_video (B, C, F, H, W), target_video (B, C, F, H, W),
#         ref_image (B, C, 1, H, W) for ego-to-exo only
# Output: scalar loss

def training_step(source_video, target_video, ref_image, prompt):
    # Encode all inputs with one shared VAE  [§4.2] [eq. 5]
    source = vae_encode(source_video)
    target = vae_encode(target_video)
    ref = vae_encode(ref_image)
    # Sample noise and a timestep for the target only  [§4.2] [eq. 1]
    noise = sample_gaussian_like(target)
    t = sample_timestep()
    noisy_target = (1 - t) * target + t * noise
    # Velocity regression target  [eq. 2]
    velocity = noise - target
    # Clean inputs use timestep 0; the noisy target uses t  [§4.2]
    timesteps = concat(zeros(source), zeros(ref), t_tokens(noisy_target))
    # Token concatenation, one sequence  [§4.2] [eq. 6]
    tokens = token_concat(ref, source, noisy_target)
    # Shared temporal positions for source and target  [§4.3] [eq. 8]
    positions = collaborative_positions(ref, source, target)
    # One backbone pass; LoRA layers are the only trainable weights  [§4.4]
    velocity_pred = transformer(tokens, timesteps, positions, prompt)
    # Keep only the target tokens  [§4.2]
    velocity_pred = select_target_tokens(velocity_pred)
    # Mean squared error against the velocity target  [eq. 2]
    loss = mean((velocity_pred - velocity) ** 2)
    return loss

Sampling (paper form, sampler details not stated)

Pseudocode
# Inference for one source clip  [§4.2] [§5.1]
# Input:  source_video (B, C, F, H, W); ref_image for ego-to-exo only
# Output: generated target video

def translate(source_video, ref_image, prompt):
    # Encode the clean conditions  [§4.2] [eq. 5]
    source = vae_encode(source_video)
    ref = vae_encode(ref_image)
    # Start the target latent from Gaussian noise  [§3]
    target = sample_gaussian((C, f, h, w))
    # Denoise along the flow with the sampler of your choice; the paper
    # does not name one. The code uses 50 steps (see Paper vs code).
    for t in sampler_timesteps():
        # Conditions stay clean at timestep 0  [§4.2]
        velocity = transformer(concat(ref, source, target), t, prompt)
        # Keep the target part of the prediction  [§4.2]
        target = sampler_step(target, select_target_tokens(velocity), t)
    return vae_decode(target)

Hyperparameters

NameValueWhereNotes
BackboneWan2.2-5B§5.1Code loads Wan2.2-TI2V-5B-Diffusers wan2-2_lora_one2three_synthetic.yaml
Trainable parametersLoRA only§4.4Text encoder and VAE frozen wan2_trainer.py
LoRA rank r80§5.1 tab. 2All four configs use 80 wan2-2_lora_one2three_synthetic.yaml
LoRA alphanot stated in paper—Code sets alpha = rank, so the scale is 1 wan2_trainer.py
LoRA target modulesattention layers§5.1Code also adapts the two feed-forward projections wan2_trainer.py
LoRA B initzeros§4.4Code uses PEFT with init_lora_weights=True wan2_trainer.py
Frames F49§5.1Latent frames f = (F−1)/4 + 1 = 13 §3
Resolution704 × 1280§5.1wan2-2_lora_one2three_synthetic.yaml
Batch size4 per GPU§5.1wan2-2_lora_one2three_synthetic.yaml
GPUs4 × NVIDIA H200§5.1Code README says the same
OptimizerAdamW§5.1betas (0.9, 0.95), eps 1e-8 not stated in paper wan2_trainer.py
Learning rate1e-4§5.1Config base 5e-5 scaled by √(GPUs × accumulation × nodes); 1e-4 on 4 GPUs wan2-2_lora_one2three_synthetic.yaml wan2_trainer.py
Weight decay1e-2§5.1wan2-2_lora_one2three_synthetic.yaml
Warmupnot stated in paper—Code: linear, 10 steps wan2-2_lora_one2three_synthetic.yaml wan2_trainer.py
Training length"about two days"§5.1Code: 8001 steps wan2-2_lora_one2three_synthetic.yaml
Precisionnot stated in paper—Code: bf16 mixed, gradient checkpointing on wan2-2_lora_one2three_synthetic.yaml wan2-2_lora_one2three_synthetic.yaml
Inference timeabout 3 min§5.1As stated by the authors
Frame stridenot stated in paper—Code: stride 2 in training, stride 1 in inference wan2-2_lora_one2three_synthetic.yaml wan2_inference.py
Synthetic clip300 frames, cut to 49§4.5 app. BSource 1440×2560 at 60 fps app. B
Real-world clip300 frames, cut to 49§4.5 app. BSource 1080×1920 at 60 fps app. B
Test set50 triplets per domain§5.1Split file not in repository
Metric setLPIPS, SSIM, FVD, VBench, CLIP-I§5.2CLIP-I for ego-to-exo only
Samplernot stated in paper—Code: UniPC multistep, flow shift 5, 50 steps, guidance 5.0 wan2_inference.py wan2_inference.py custom_pipeline.py
Text dropoutnot stated in paper—Code: 10% of prompts replaced with empty text in training wan2_trainer.py
Promptnot stated in paper—Code uses "Transform it into the third-person perspective." for ego-to-exo and "first-person" for exo-to-ego custom_dataset.py

Results

Author-reported. Setup: Wan2.2-5B fine-tuned separately for synthetic and real-world data, 50 held-out triplets per domain, comparisons against four baselines §5.1 §5.2.

Baselines are AnyV2V, I2VEdit, TrajectoryCrafter and ReCamMaster §5.1. An asterisk means the baseline was fine-tuned on EgoExo-8K tab. 1. Zero-shot TrajectoryCrafter has no CLIP-I score because it cannot generate a customised character tab. 1.

Synthetic scenarios tab. 1.

MethodExo→Ego LPIPS↓SSIM↑FVD↓VBench↑Ego→Exo LPIPS↓SSIM↑FVD↓VBench↑CLIP-I↑
AnyV2V0.66270.4870990.30.75950.68090.45161285.90.73110.6240
I2VEdit*0.62720.5154477.20.80370.63850.4940737.40.78800.7470
TrajectoryCrafter0.61090.5068743.20.79670.61120.5031745.40.8171–
ReCamMaster0.65160.4039738.70.76340.61780.4629915.70.77800.6537
ReCamMaster*0.60390.5365298.90.80980.57320.5125531.50.81160.7129
WorldWander0.58110.5416230.30.81100.55500.5215353.70.83950.7672

The first four metric columns are exocentric-to-egocentric, and the next five are egocentric-to-exocentric, with CLIP-I used only in that direction tab. 1.

Real-world scenarios tab. 1.

MethodExo→Ego LPIPS↓SSIM↑FVD↓VBench↑Ego→Exo LPIPS↓SSIM↑FVD↓VBench↑CLIP-I↑
AnyV2V0.72270.33941789.30.68130.71820.28851451.20.67050.5836
I2VEdit*0.69450.34281226.30.79960.68920.3253904.40.78150.6601
TrajectoryCrafter0.70580.31271238.40.79770.69280.32151126.50.7583–
ReCamMaster*0.67520.3476716.10.79330.66990.3048968.10.77870.7020
WorldWander0.60540.3567416.50.83330.53570.3469374.70.81420.7214

Other reported results:

  • A user study with 630 valid responses prefers WorldWander across the subjective criteria. Only the figure is available; the numbers are not in the text §5.2 fig. 6.
  • Ablation (synthetic only, because of limited resources) tab. 2 §5.4:
VariantExo→Ego LPIPS↓SSIM↑FVD↓VBench↑Ego→Exo LPIPS↓SSIM↑FVD↓VBench↑CLIP-I↑
Channel concat.0.60080.5221280.20.80720.62050.4708524.30.83770.7310
Uniform timestep0.59630.5209287.70.80630.55510.5211365.90.83890.7429
Uniform position enc.0.59070.5325280.30.80440.57710.5083356.50.83570.7562
LoRA r = 640.59310.5260282.60.80830.54710.5165362.90.83060.7461
LoRA r = 80 (final)0.58110.5416230.30.81100.55500.5215353.70.83950.7672
LoRA r = 1280.58190.5351273.00.81220.55870.5202344.90.83920.7556

The first four metric columns are exocentric-to-egocentric, as in the main table.

  • In the ablation, rank 80 is picked as the best overall, but rank 64 and rank 128 each win on some metrics tab. 2 §5.4.

Paper vs code

Official repository: showlab/WorldWander, commit c9f12e85730d3976f1e89df5ee8248f7f3575a7a (cloned with --depth 1). The paper's author block links this repository. The repository has no LICENSE file.

  • Loss weighting. Paper: plain flow-matching MSE eq. 2. Code: the per-sample MSE is multiplied by a timestep weight, a bell-shaped curve centred mid-schedule and normalised to mean 1 wan2_trainer.py my_schedule.py.
  • Timestep distribution. Paper: t drawn from U(0, 1) eq. 2. Code: a uniform index over 1000 discrete steps of a sigma schedule warped with shift 5, then multiplied by 1000 wan2_trainer.py wan2_trainer.py my_schedule.py my_schedule.py.
  • Learning rate. Paper: 1e-4 §5.1. Code: base 5e-5 scaled by √(GPUs × accumulation × nodes) wan2-2_lora_one2three_synthetic.yaml wan2_trainer.py. The two agree only at 4 GPUs with no gradient accumulation.
  • LoRA targets. Paper: attention layers §5.1. Code: query, key, value, output projections and both feed-forward projections wan2_trainer.py.
  • Concatenation axis. Paper: concatenation along the token dimension §4.2. Code: the frame axis is concatenated before patch embedding, giving the order reference, source, target transformer_wan.py transformer_wan.py.
  • Reference preprocessing. Code: the reference image is resized straight to 704 × 1280 with no crop, so the aspect ratio is not kept custom_dataset.py. Video frames use a long-side resize followed by a centre crop custom_dataset.py. The paper does not say how the reference is resized.
  • Reference positions. Code: the reference takes temporal position 0, and the source and target then share positions 1 to F transformer_wan.py. The paper's position equation includes a term for the reference but does not say which index it uses eq. 8.
  • Exo-to-ego positions. Code: source and target each start at temporal position 0 transformer_wan.py. This matches the paper's shared-position claim.
  • Text dropout. Code: 10% of prompts are replaced with empty text during training wan2_trainer.py. Not in the paper.
  • Sampler and guidance. Code: UniPC multistep, flow shift 5, 50 steps by default, guidance 5.0 with an empty negative prompt wan2_inference.py wan2_inference.py custom_pipeline.py custom_pipeline.py. The paper states none of these.
  • Test-time preprocessing. The resize and crop lines in the test dataset are commented out, so test frames and references are used at native resolution custom_dataset.py custom_dataset.py. Test stride is hard-coded to 1 wan2_inference.py; training uses stride 2 wan2-2_lora_one2three_synthetic.yaml.
  • Clip sampling. Paper: 5-second, 300-frame clips, with F = 49 used for training §4.5 §5.1. Code: a random start and 49 frames taken every second frame, so one sample spans about 97 source frames custom_dataset.py.
  • Ablation variants. Channel concatenation and uniform timestep are not in the repository. Only uniform position encoding is a switch transformer_wan.py transformer_wan.py. The LoRA rank configs contain only rank 80 wan2-2_lora_one2three_synthetic.yaml.
  • Released data. The README links the synthetic dataset (EgoExo-Synthetic). It does not link the real-world subset README.md.
  • Baseline inputs. The appendix says TrajectoryCrafter received camera poses from the training set. WorldWander uses none app. A §4.1.

Pitfalls

  • Direction names. In the code, one2three means ego-to-exo with a reference image. three2one means exo-to-ego wan2-2_lora_one2three_synthetic.yaml wan2-2_lora_three2one_synthetic.yaml.
  • Clean-token timesteps. The code gives clean tokens timestep 0 and noisy target tokens a per-token timestep. The per-token timestep comes from the mask subsampled by 2 on height and width, which assumes a 2×2 spatial patch wan2_trainer.py.
  • Target slicing. The model returns the full sequence. Only the trailing target tokens are the prediction. Dropping this slice gives a shape error or wrong loss transformer_wan.py.
  • Position trick. Reusing the condition's rotary embedding for the target depends on the reference occupying exactly one temporal slot. The index arithmetic is fragile transformer_wan.py.
  • Sequence length. The source (or reference plus source) is concatenated with the target, so the attention sequence is about twice the target's token count. This is derived from the architecture, not reported. The paper gives only the wall-clock inference time §5.1.
  • Paper inconsistency on resolution. The main text uses 704 × 1280 §5.1. The baseline appendix resizes all methods to 704 × 1024 app. A. The code uses 704 × 1280 for WorldWander.
  • Figure reference mismatch. The LoRA-rank results are cited to the ablation figure, but the numbers are in the ablation table §5.4 tab. 2.
  • "Scene" means domain. The paper says the model is fine-tuned per scene. The code's configs show one model per domain (synthetic or real) and direction §5.1 wan2-2_lora_one2three_realworld.yaml.
  • Fair-comparison caveats. Only the baselines marked * were fine-tuned. TrajectoryCrafter was zero-shot and given camera poses. AnyV2V and I2VEdit edit the first frame with Qwen-image-edit first app. A. The test sets are 50 triplets per domain and no split file is in the repository.
  • Numbering. Figure, table and equation numbers in this card were counted from the LaTeX source. The compiled PDF was not checked.
  • Scale. The paper states 4 H200 GPUs for training and about 3 minutes for inference, with no memory figure. The README recommends an 80 GB GPU for inference README.md.

Lineage

  • Builds on: Wan2.2-5B as the backbone §3 §5.1, cited as the Wan model paper, arXiv:2503.20314 [bib]. LoRA and flow matching are cited but not carded.
  • Compared against: AnyV2V (arXiv:2403.14468 [bib]), I2VEdit, TrajectoryCrafter and ReCamMaster. None have cards in this wiki.
  • Superseded by: not known.

Source and license

Adapted from “WorldWander: Bridging Egocentric and Exocentric Worlds in Video Generation” by Quanjian Song, Yiren Song, Kelly Peng, Yuan Gao, Mike Zheng Shou (arXiv:2511.22098), used under CC BY-SA 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. This page is licensed under CC BY-SA 4.0. Code citations refer to https://github.com/showlab/WorldWander at commit c9f12e85730d (none (no LICENSE file in repository)). Any quoted code is shown under that license.