Thor Lab · kennisnotitieIntegratie: splat plus realtime generatie naar een productIntegration: splat plus realtime generation toward a product

De integratieweg: splat plus realtime generatieThe integration path: splat plus realtime generation

De draden uit de recente Monday-briefings samengebracht: welke paden naar een navigeerbare splat plus live verf-laag zijn echt vruchtbaar, en welke niet.The threads from the recent Monday briefings brought together: which paths toward a navigable splat plus a live paint layer are genuinely fruitful, and which are not.

21 juli 2026 · Aanleiding: Dino zoekt de integratie tussen onze splat-lijn en realtime video, met het oog op een product (de Notulist)Prompted by: Dino is looking for the integration between our splat line and realtime video, with a product in mind (the Notulist)

De kernThe finding

Elke schakel van de keten navigeerbare splat → 2D-view → realtime restyle → beamer of product bestaat nu al als losse, grotendeels kant-en-klare component. Het enige stuk dat wij zelf moeten bouwen is de Index-Only firewall: de splat wijst naar de gevalideerde solver-waarheid, maar overschrijft die nooit. Verf en waarheid blijven gescheiden.Every link in the chain navigable splat → 2D view → realtime restyle → projector or product now already exists as a separate, mostly off-the-shelf component. The only piece we must build ourselves is the Index-Only firewall: the splat points at the validated solver truth but never overwrites it. Paint and truth stay separate.

Keten bestaat alChain already exists Lokaal gemeten: 9 tot 13 fpsMeasured local: 9 to 13 fps Moat = Index-Only firewallMoat = Index-Only firewall TD = schil, niet het productTD = shell, not the product

The integration chain: navigable splat scene, render to 2D view, realtime diffusion restyle, projector output, with the truth layer kept separate underneath
De keten. Een navigeerbare splat-scene levert een 2D-view, een realtime diffusiemodel verft die per frame, de beamer toont het in de ruimte. De waarheid-laag (solver, maten) loopt er los onderdoor en wordt nooit aangeraakt.The chain. A navigable splat scene yields a 2D view, a realtime diffusion model paints it per frame, the projector shows it in the room. The truth layer (solver, dimensions) runs separately underneath and is never touched.

1Drie lagen: verf, geometrie, waarheidThree layers: paint, geometry, truth

De hele integratie moet onze standing-regel respecteren (2026-06-12): de splat is verf (de tonende laag), de solver is de liniaal (de waarheid). Realtime diffusie voegt een derde laag toe die per frame pixels herschildert. Die drie moeten gestapeld maar gescheiden blijven.The whole integration must respect our standing rule (2026-06-12): the splat is paint (the display layer), the solver is the ruler (the truth). Realtime diffusion adds a third layer that repaints pixels per frame. The three must be stacked but kept separate.

Three stacked layers: paint (realtime restyle) on top, geometry (splat) in the middle, truth (solver mesh with ruler) at the bottom, connected by a one-way pointer
Verf boven (realtime restyle), geometrie in het midden (splat), waarheid onder (solver). Een enkele pijl loopt omhoog: de verf-laag mag naar de waarheid wijzen, nooit erin schrijven.Paint on top (realtime restyle), geometry in the middle (splat), truth at the bottom (solver). A single arrow runs up: the paint layer may point at the truth, never write into it.

2Wat we vandaag lokaal matenWhat we measured locally today

De grote onbekende uit de Lucy-notitie was: is de lokale realtime restyle snel genoeg om de cloud te vervangen? We hebben StreamDiffusion V2 op de Blackwell gezet (WSL2, torch 2.11 cu128, sm_120) en de echte framerate gemeten. Het transformeert een live feed structuur-behoudend: de kat blijft in dezelfde pose en scene lopen, maar wordt een hond zoals de prompt vraagt.The big unknown from the Lucy note was: is the local realtime restyle fast enough to replace the cloud? We put StreamDiffusion V2 on the Blackwell (WSL2, torch 2.11 cu128, sm_120) and measured the real framerate. It transforms a live feed while preserving structure: the cat keeps walking in the same pose and scene, but becomes a dog as the prompt asks.

ModelModelResolutieResolutionSterkteStrengthVAEfps (1 GPU)fps (1 GPU)
1.3B480x8320.5standaardstandard13,0
1.3B480x8320.8standaardstandard10,6 (13,3 op de dog-clipon the dog clip)
1.3B720x12800.8standaardstandard5,6
1.3B720x12800.8TAEHV9,2 (+65%)
14B480x8320.8standaardstandard9,6
14B720x12800.8standaardstandard3,7
Kwaliteit tegenover snelheid: het 14B-verrassingQuality versus speed: the 14B surpriseHet 14B-model draait op 480p bijna net zo snel als 1.3B (9,6 tegen 10,6 fps) maar levert een duidelijk scherper beeld, omdat het met 1 diffusiestap werkt in plaats van 2. De keuze wordt dus simpel: 1.3B voor de hoogste framerate op 720p (met de lichte TAEHV-VAE, 9,2 fps), 14B voor het beste beeld op 480p. Beide draaien lokaal, Apache-2.0, op de kaart die we al hebben, met ruim VRAM over (14B laadt ~30 GB in de 96 GB).The 14B model runs at 480p almost as fast as 1.3B (9.6 versus 10.6 fps) but delivers a clearly sharper image, because it works in 1 diffusion step instead of 2. So the choice is simple: 1.3B for the highest framerate at 720p (with the light TAEHV VAE, 9.2 fps), 14B for the best image at 480p. Both run locally, Apache-2.0, on the card we already have, with plenty of VRAM to spare (14B loads about 30 GB into the 96 GB).
Opname van de test. Links de live input (een kat), rechts de realtime-getransformeerde output (een hond), 1.3B op 480p, ~13 fps op de Blackwell. Zelfde pose, camera en gras; alleen het onderwerp verandert zoals de prompt vraagt. Dit is structuur-behoudende video-naar-video, geen nieuw beeld uit het niets.Recording of the test. Left the live input (a cat), right the realtime transformed output (a dog), 1.3B at 480p, about 13 fps on the Blackwell. Same pose, camera and grass; only the subject changes as the prompt asks. This is structure-preserving video-to-video, not a new image from scratch.
Kwaliteit tegenover snelheid, zelfde 480p-clip. Links 1.3B (~10,6 fps), rechts 14B (9,6 fps). Rechts is duidelijk scherper, omdat 14B met een enkele diffusiestap draait in plaats van twee, bij bijna dezelfde framerate.Quality versus speed, same 480p clip. Left 1.3B (about 10.6 fps), right 14B (9.6 fps). The right is clearly sharper, because 14B runs in a single diffusion step instead of two, at almost the same framerate.
De onbekende is beantwoordThe unknown is answeredJa: lokaal realtime is haalbaar. Het 1.3B-model draait usable-realtime op onze eigen kaart (10 tot 13 fps op 480p, ~9 fps op 720p met de lichte TAEHV-VAE), Apache-2.0, geen cloud, geen kosten per seconde. De schatting van 6 tot 10 fps uit de Lucy-notitie was aan de voorzichtige kant.Yes: local realtime is feasible. The 1.3B model runs usable-realtime on our own card (10 to 13 fps at 480p, about 9 fps at 720p with the light TAEHV VAE), Apache-2.0, no cloud, no per-second cost. The 6 to 10 fps estimate from the Lucy note was on the cautious side.

3Vruchtbare paden: het oordeelFruitful paths: the verdict

A branching route map of the candidate paths ending in green fruitful, amber speculative, or grey dead-end verdict badges
De kandidaat-paden met een oordeel per tak. Groen = vruchtbaar en nu bouwbaar, amber = veelbelovend maar onbewezen of zwaar, grijs = doodlopend voor onze context.The candidate paths with a verdict per branch. Green = fruitful and buildable now, amber = promising but unproven or heavy, grey = dead-end for our context.
PadPathRolRoleOordeelVerdictWaaromWhy
StreamDiffusion V2 (lokaal)(local)realtime restylerealtime restylevruchtbaar (gemeten)fruitful (measured)Apache-2.0, 9 tot 13 fps op onze kaart, headless module al aanwezigApache-2.0, 9 to 13 fps on our card, headless module already present
Krea Realtime 14B (lokaal)(local)realtime restylerealtime restylevruchtbaarfruitfulApache-2.0, EU-veilig, ~11 fps, v2v met prompt-swap, meer kwaliteit dan 1.3BApache-2.0, EU-safe, about 11 fps, v2v with prompt swap, more quality than 1.3B
Feed-forward 3DGS (AnySplat)splat-generatiesplat generationvruchtbaar (bewezen)fruitful (proven)vandaag lokaal gedraaid: 12 foto's → 1,56M gaussians in 1,16 s op de Blackwell, pose-free, MIT, geldige .plyrun locally today: 12 photos → 1.56M gaussians in 1.16 s on the Blackwell, pose-free, MIT, valid .ply
Marble → splat-exportwereld naar splatworld to splatvruchtbaarfruitfulgenereer cloud, exporteer de splat, draai lokaal realtime; sluit direct op onze splat-lijngenerate cloud, export the splat, run locally in realtime; plugs straight into our splat line
revit_to_splat / Snowdon PBRsplat-generatiesplat generationvruchtbaar (loopt)fruitful (in flight)relightable PBR GS-IR, photogrammetry-pass is al greenlitrelightable PBR GS-IR, the photogrammetry pass is already greenlit
SOG / .spz + WebGPUleveringdeliveryvruchtbaarfruitful8,4x compressie, splat naar de browser = de product-leveringslaag8.4x compression, splat to the browser = the product delivery layer
Index-Only firewallde moatthe moatvruchtbaar (bouwen)fruitful (to build)de enige echte eigen bouw: pointer naar de waarheid, nooit de waarde zelfthe only real in-house build: a pointer to the truth, never the value itself
Lucy 2.5 (cloud)(cloud)realtime restylerealtime restylevruchtbaar maar cloudfruitful but cloudbeste live reference-edit, maar frames verlaten de EU en er tikt een prijs per secondebest live reference edit, but frames leave the EU and a per-second price ticks
Thinking-in-Boxes / depth-ControlNetstructuur-lockstructure lockvruchtbaar (toekomst)fruitful (future)3D-bbox of depth-conditionering houdt de geometrie vast terwijl alleen de stijl verandert; nog te bouwen3D bbox or depth conditioning locks geometry while only the style changes; still to build
Matrix-Game 3.0wereldmodelworld modelvruchtbaar maar zwaarfruitful but heavyenige open lokale generatieve wereld (~40 fps, 5B+INT8), maar game-domein en zware opzetonly open local generative world (about 40 fps, 5B+INT8), but game domain and heavy setup
seen2scene .plyscan-intakescan intakelet opcaveateen .ply uit TSDF-fusie is een mesh/puntenwolk, geen trainbare splat: een valse vrienda .ply from TSDF fusion is a mesh/point cloud, not a trainable splat: a false friend
Odysseywereldmodelworld modelvermijdenavoidrealtime maar volledig cloud, dus latency-risico op locatierealtime but fully cloud, so on-site latency risk
Genie 3wereldmodelworld modeldoodlopenddead-endUS-only, geen API, geen export, niet self-hostbaarUS-only, no API, no export, not self-hostable
Lucy-Edit-Devrestyle (open)restyle (open)doodlopenddead-endtekst-only, geen referentiebeeld, niet-commerciele licentietext-only, no reference image, non-commercial licence

4Nieuw uit de research: feed-forward splatsNew from the research: feed-forward splats

De sterkste nieuwe draad uit de Monday-briefing van deze week is feed-forward 3DGS (Instant NuRec, Flash-score 95, top pick). In plaats van uren per-scene optimaliseren maakt een enkele forward-pass uit gekalibreerde camerabeelden meteen een simuleerbare splat-scene. Dat verandert de splat van een off-line asset in iets dat je bijna live uit een scan kunt halen, precies de intake die seen2scene mist.The strongest new thread from this week's Monday briefing is feed-forward 3DGS (Instant NuRec, Flash score 95, top pick). Instead of hours of per-scene optimization, a single forward pass turns calibrated camera views straight into a simulatable splat scene. That turns the splat from an offline asset into something you can pull almost live from a scan, exactly the intake seen2scene lacks.

Feed-forward 3DGS: RGB-D capture and calibrated views into a single neural forward pass, producing a navigable splat scene in seconds not hours
Feed-forward 3DGS: RGB-D en gekalibreerde views in een enkele forward-pass, direct een navigeerbare splat. Seconden in plaats van uren, testbaar op de Blackwell met de Gemini 335L dieptecamera.Feed-forward 3DGS: RGB-D and calibrated views into a single forward pass, straight to a navigable splat. Seconds instead of hours, testable on the Blackwell with the Gemini 335L depth camera.
Vandaag lokaal bewezen (AnySplat)Proven locally today (AnySplat)Instant NuRec bleek bij nader inzien alleen voor auto-rij-scenes met bekende poses, dus we pakten AnySplat (MIT, pose-free, 2 tot 8+ gewone foto's). Op de Blackwell: 12 foto's naar een navigeerbare splat van 1.561.384 gaussians in 1,16 seconden, een geldige .ply die opent in SuperSplat, Spark of TouchDesigner GSOPs. De feed-forward intake die seen2scene miste, werkt dus nu echt, en het is de scene-helft van de keten hierboven.Instant NuRec turned out to be for driving scenes with known poses only, so we took AnySplat (MIT, pose-free, 2 to 8+ ordinary photos). On the Blackwell: 12 photos to a navigable splat of 1,561,384 gaussians in 1.16 seconds, a valid .ply that opens in SuperSplat, Spark or TouchDesigner GSOPs. The feed-forward intake seen2scene lacked now genuinely works, and it is the scene half of the chain above.
De gereconstrueerde splat, gerenderd tot een vloeiende camera-flythrough (gsplat op de Blackwell, sm_120, 121 frames in 1,6 s). Volledig uit 12 gewone foto's, geen tekening of tussenkomst. Dit is de navigeerbare scene links in de keten: jij vliegt de camera, de splat levert een schone 2D-view voor de restyle-stap. Merk op dat de geometrie klopt, inclusief het kussen en de plafondbalken.The reconstructed splat, rendered into a smooth camera flythrough (gsplat on the Blackwell, sm_120, 121 frames in 1.6 s). Entirely from 12 ordinary photos, no drawing or intervention. This is the navigable scene on the left of the chain: you fly the camera, the splat gives a clean 2D view for the restyle step. Note the geometry holds up, down to the pillow and the ceiling beams.

Andere bruikbare draden uit de briefings: Thinking-in-Boxes (3D-bbox conditionering voor consistente edits, de structuur-lock voor de restyle-stap), AsySplat (lange stads-sequenties), IBPA (streaming puntenwolk naar mesh) en Vision-Language-Motion Maps (bevraagbare 3D-scene, sluit op onze Index-Only doelstelling).Other useful threads from the briefings: Thinking-in-Boxes (3D bbox conditioning for consistent edits, the structure lock for the restyle step), AsySplat (long city sequences), IBPA (streaming point cloud to mesh), and Vision-Language-Motion Maps (queryable 3D scene, aligned with our Index-Only goal).

5Van installatie naar product: schaalbaarheidFrom installation to product: scalability

TouchDesigner (GSOPs voor splats plus StreamDiffusionTD voor de restyle) is de snelste weg naar een installatie op je werkstation, maar het is de verkeerde basis voor een product: per-seat, GUI, niet-headless, niet horizontaal schaalbaar. Je stuurt TD nooit de cloud in.TouchDesigner (GSOPs for splats plus StreamDiffusionTD for the restyle) is the fastest route to an installation on your workstation, but it is the wrong base for a product: per-seat, GUI, not headless, not horizontally scalable. You never ship TD to the cloud.

Split board: a prototype authoring shell on the left driving a projector, versus a headless product runtime on the right with cloud GPU workers each serving one live stream
Links de prototype-schil (TD, een seat, niet schaalbaar). Rechts de product-runtime: een headless service met GPU-workers, elk goed voor een live-stream, autoscalend. De goedkope waarheid-service (per request) staat los van de dure verf-service (per stream).Left the prototype shell (TD, one seat, not scalable). Right the product runtime: a headless service with GPU workers, each good for one live stream, autoscaling. The cheap truth service (per request) sits apart from the costly paint service (per stream).
Het is al losgekoppeldIt is already decoupledStreamDiffusion V2 is geen TD-plugin maar een standalone pakket dat een headless FastAPI plus WebSocket-server meelevert, met per-user sessies en capaciteitsafhandeling. Dat is het product-skelet: containerize het, zet er WebRTC voor, klaar. TD is een optionele front-end, geen afhankelijkheid.StreamDiffusion V2 is not a TD plugin but a standalone package that ships a headless FastAPI plus WebSocket server, with per-user sessions and capacity handling. That is the product skeleton: containerize it, put WebRTC in front, done. TD is an optional front-end, not a dependency.
De harde unit-economicsThe hard unit economicsRealtime diffusie kost ~1 GPU per gelijktijdige live-stream, net als Lucy per seconde. Je schaalt met GPU-workers, niet door streams te stapelen. Voor de Notulist: de kern (schets naar model, geometrie) is een goedkope per-request inferentie. Laat de dure verf-laag de product-economie niet bepalen.Realtime diffusion costs about 1 GPU per concurrent live stream, just like Lucy per second. You scale with GPU workers, not by stacking streams. For the Notulist: the core (sketch to model, geometry) is a cheap per-request inference. Do not let the costly paint layer define the product economics.

6De moat: de Index-Only firewallThe moat: the Index-Only firewall

Bijna alles in de keten is off-the-shelf. Het enige dat ons onderscheidt en dat we zelf bouwen is de Index-Only firewall (crown-regel, 2026-06-12): elk splat-punt draagt een pointer (een element-id) naar de gevalideerde solver-waarde, nooit de waarde zelf. Klik op de splat, een ID-buffer pikt het punt, en pas dan wordt de gevalideerde waarde opgezocht. Zo blijft de mooie tonende laag altijd wijzen naar, maar nooit overschrijven, de waarheid uit de simulatie.Almost everything in the chain is off-the-shelf. The only thing that sets us apart and that we build ourselves is the Index-Only firewall (crown rule, 2026-06-12): each splat point carries a pointer (an element id) to the validated solver value, never the value itself. Click the splat, an ID buffer picks the point, and only then is the validated value looked up. This keeps the beautiful display layer always pointing at, but never overwriting, the truth from the simulation.

A splat surface where a click sends a pointer (element id) across a firewall to a validated solver value; the splat carries the pointer, never the value
De moat. Een klik op de splat stuurt een pointer (element-id) over de firewall naar een gevalideerde solver-waarde met eenheid. De splat draagt de pointer, nooit de waarde. Format boven renderer, de WOW zit in de firewall-klik, niet in de pixels.The moat. A click on the splat sends a pointer (element id) across the firewall to a validated solver value with units. The splat carries the pointer, never the value. Format over renderer; the WOW is in the firewall click, not the pixels.

7Aanbevolen stack en volgende stappenRecommended stack and next steps

De stack die nu staatThe stack that stands nowGeometrie: feed-forward 3DGS (Instant NuRec) of Marble-export voor de scene, onze eigen revit_to_splat/GS-IR voor relightable gebouwen. Verf: StreamDiffusion V2 lokaal (gemeten, headless) voor installaties, Krea 14B voor meer kwaliteit, Lucy alleen cloud voor niet-gevoelige demo's. Levering: SOG/.spz naar een WebGPU-viewer. Waarheid: de Index-Only firewall, ons eigen stuk.Geometry: feed-forward 3DGS (Instant NuRec) or Marble export for the scene, our own revit_to_splat/GS-IR for relightable buildings. Paint: StreamDiffusion V2 local (measured, headless) for installations, Krea 14B for more quality, Lucy cloud only for non-sensitive demos. Delivery: SOG/.spz to a WebGPU viewer. Truth: the Index-Only firewall, our own piece.

8In TouchDesigner draaien (de proof)Running it in TouchDesigner (the proof)

Om de keten live te voelen draai je hem in TouchDesigner: je vliegt een camera door de splat, TD rendert die view, een realtime diffusiemodel verft elke frame, en de output gaat naar de beamer. De splat om mee te testen staat klaar (anysplat_riverview.ply). Er zijn twee paden, en ze gebruiken niet hetzelfde model.To feel the chain live you run it in TouchDesigner: you fly a camera through the splat, TD renders that view, a realtime diffusion model paints each frame, and the output goes to the projector. The splat to test with is ready (anysplat_riverview.ply). There are two paths, and they do not use the same model.

Pad A, off-the-shelf (snelst)Path A, off-the-shelf (fastest)GSOPs (gratis, laadt onze .ply, live splat-render) → StreamDiffusionTD (DotSimulate, betaald). Let op: dat wrapt StreamDiffusion v1-turbo, niet de V2 die ik maat. Splat-render-TOP als input, prompt + 1 tot 4 stappen, output naar venster of beamer. Animeer de camera voor de macro naar micro vlucht.GSOPs (free, loads our .ply, live splat render) → StreamDiffusionTD (DotSimulate, paid). Note: it wraps StreamDiffusion v1-turbo, not the V2 I measured. Splat-render TOP as input, prompt + 1 to 4 steps, output to a window or projector. Animate the camera for the macro to micro flight.
Pad B, onze V2 (meer bedrading)Path B, our V2 (more wiring)GSOPs-render → Spout/NDI uit TD → de StreamDiffusion V2 headless server (demo/main.py, WSL, WebSocket) → resultaat via Spout/NDI terug in TD. Gebruikt exact de V2 die ik benchmarkte (9 tot 13 fps), vraagt alleen een klein custom bruggetje.GSOPs render → Spout/NDI out of TD → the StreamDiffusion V2 headless server (demo/main.py, WSL, WebSocket) → result back via Spout/NDI into TD. Uses exactly the V2 I benchmarked (9 to 13 fps), only needs a small custom bridge.

Begin met Pad A om de keten te voelen, ga naar Pad B voor de V2-kwaliteit in een installatie. De waarheid blijft gescheiden: de restyle is verf en hoort uit het meet-pad; per-punt gevalideerde waarden komen via de Index-Only firewall hieronder, niet via de diffusie-output. Volledige stap-voor-stap: RUNBOOK_touchdesigner.md in de studie-map.Start with Path A to feel the chain, move to Path B for V2 quality in an installation. The truth stays separate: the restyle is paint and belongs out of the measurement path; per-point validated values come via the Index-Only firewall below, not via the diffusion output. Full step-by-step: RUNBOOK_touchdesigner.md in the study folder.

Bronnen en grondslagSources and grounding Samengebracht uit de Monday-research-briefings (monitors 2026-07-20 en 2026-06-22), de Lucy 2.5-notitie, drie parallelle web-research-agenten, een read-only digest van onze eigen research- en sessie-geschiedenis, en een echte benchmark van StreamDiffusion V2 op de Blackwell (WSL2, torch 2.11 cu128, sm_120).Brought together from the Monday research briefings (monitors 2026-07-20 and 2026-06-22), the Lucy 2.5 note, three parallel web-research agents, a read-only digest of our own research and session history, and a real benchmark of StreamDiffusion V2 on the Blackwell (WSL2, torch 2.11 cu128, sm_120).

Kern-referentiesKey references: Instant NuRec (feed-forward 3DGS) · StreamDiffusion V2 (MLSys 2026) · Krea Realtime 14B · World Labs Marble · Matrix-Game 3.0 · GSOPs (splats in TouchDesigner) · NVIDIA Lyra. Alle illustraties: Nano Banana Pro 2.All illustrations: Nano Banana Pro 2.