Communitygithub.com

atlas-flythrough

Transformez des photographies ou des images générées en mouvements de caméra exploitant la profondeur avec World Labs Atlas. Idéal pour des walkthroughs, survols, dévoilements ou orbites dans une scène basée sur une image.

Qu'est-ce que atlas-flythrough ?

Ce skill permet de créer des mouvements de caméra cinématographiques à partir d'une seule image fixe (photographie ou rendu) en utilisant l'API World Labs Atlas et ses capacités de reconstruction de profondeur et de points de vue. Il guide l'utilisateur à travers un flux de travail complet : préparation de la scène avec Python et NumPy, génération de vues de support éparses via des appels API (`images2PosedRGBD`, `atlasGenerate`), sélection d'ancres pour les passages difficiles (orbites, dévoilements), rendu dense de la trajectoire, et export vidéo avec FFmpeg. L'accent est mis sur la cohérence géométrique (mêmes coordonnées monde pour les caméras et les cartes de profondeur) et la qualité visuelle (ancres stables, ligne de vue dégagée, mouvement latéral plutôt que simple zoom). Le skill prend en charge l'amélioration de prompt, la sélection manuelle des meilleures vues de support, la comparaison de jeux d'ancres, et des effets optionnels comme le mouvement de marche (`--footfalls`).

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wendlerc/atlas-skills/tree/main/skills/atlas-flythrough

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Atlas flythrough

Choisissez ce que le spectateur doit découvrir à la fin du plan. Inspectez l'image fixe pour repérer les premiers plans, les espaces de déplacement ouverts et les points de repère à différentes profondeurs. Un décalage latéral devant un objet de premier plan rend l'échelle plus lisible. Un angle inversé nécessite des preuves de ce qui se trouve derrière le sujet.

Utilisez une CLI World Labs authentifiée, Python 3 avec NumPy et FFmpeg. Travaillez dans un répertoire de plan frais. Définissez PREP sur le chemin absolu de scripts/prepare.py dans ce skill. Fournissez un JPEG et ses dimensions de sortie souhaitées.

L'amélioration de prompt est activée par défaut pour les vues de support et le vol final. Passez --no-enhance-prompt à une commande de génération dans prepare.py pour utiliser le prompt de scène tel quel pour ce passage.

python3 "$PREP" pose scene.jpg --resolution 1280 720 > pose-request.json
worldlabs tasks run images2PosedRGBD --request pose-request.json --wait --json > pose.json

Écrivez shot.json avec un prompt de scène et des images clés. Chaque ligne spécifie le temps normalisé, le déplacement XYZ local à la caméra (droite, haut, arrière), les coordonnées U et V normalisées du point visé dans l'image (depuis le coin supérieur gauche), la profondeur de visée en unités de la caméra source, le multiplicateur de focale et le roulis en degrés. Gardez le temps strictement croissant de 0 à 1. Inspectez la profondeur estimée pour choisir les distances à l'échelle de la scène. Ce mouvement latéral minimal est un point de départ :

{"prompt":"Un atelier ensoleillé avec un établi et de hautes fenêtres.","knots":[[0,0,0,0,0.5,0.5,2,1,0],[0.5,0.15,0,-0.12,0.53,0.5,2,1,0],[1,0.35,0,-0.25,0.57,0.5,2,1,0]]}
python3 "$PREP" angles shot.json --pose pose.json --supports 6 > supports-request.json
worldlabs tasks run atlasGenerate --request supports-request.json --wait --json > supports.json
worldlabs operations download "$(jq -er '.id' supports.json)" --out supports

Inspectez les supports dans l'ordre du chemin avant le rendu complet. Suivez le même point de repère à travers les angles voisins. Pour une correspondance exacte avec l'entrée à l'image zéro, utilisez la caméra posée originale là-bas.

Sélectionner des ancres pour un mouvement difficile

Pour un passage, une orbite ou un dévoilement inversé, explorez les deux côtés de l'obstruction et le milieu du virage. Utilisez l'API Développeur pour des images de style Viewfinder. Exécutez atlasGenerate avec des targetCameras éparses, returnDepth: true et enhancePrompt: true. Un mouvement simple avec une bonne couverture peut utiliser le premier passage de support.

Lorsque le premier passage est incohérent, générez des alternatives aux mêmes poses de caméra. Gardez le tableau de cibles éparses et le prompt de scène fixes. Variez les vues posées antérieures fiables que vous fournissez dans contextFrames, par exemple en favorisant les vues côté entrée dans un passage et les vues côté sortie dans un autre. Gardez toutes les caméras et cartes de profondeur dans les mêmes coordonnées monde.

Disposez les candidates avec une colonne par temps de caméra et une ligne par passage. Comparez chaque candidate avec les vues de chaque côté. Recherchez une ouverture continue, une silhouette de point de repère stable, une profondeur de premier plan plausible et une ligne de vue dégagée. Inspectez la profondeur sur les surfaces près desquelles la caméra passe. Choisissez les vues qui concordent à travers la séquence. Sautez les poses redondantes ou cassées, ou explorez un angle manquant avant de vous engager dans le rendu dense.

Pour utiliser une sélection mixte, enregistrez chaque choix comme un index d'image basé sur zéro dans son opération sauvegardée. Par exemple, après avoir téléchargé et examiné deux passages de six vues, construisez le contexte final avec jq. Remplacez par vos propres choix. Gardez l'actif RVB, l'actif de profondeur et la caméra ensemble à partir de la même image retournée.

# Sauvegardez les choix pour pouvoir reconstruire le même contexte plus tard.
echo '[["A",0],["B",2],["A",4],["B",5]]' > picks.json
jq -n --slurpfile a supports.json --slurpfile b alternate.json --slurpfile picks picks.json '
  {A: $a[0].response.frames, B: $b[0].response.frames} as $runs
  | [$picks[0][] as [$run, $i]
     | ($runs[$run][$i] // error("Ancre inconnue : \($run)[\($i)]"))
     | {camera, imageAsset: {assetId: .imageAsset.assetId},
        depth: {depthAsset: {assetId: .depth.depthAsset.assetId}}}]
' > anchors.json

Rendre et comparer

Préparez la requête de caméra dense à partir des images clés du plan.

python3 "$PREP" flight shot.json --pose pose.json --angles supports.json --frames 120 > flight-request.json

Si vous avez organisé un ensemble mixte, remplacez ces ancres maintenant. Cela préserve la première image posée aux côtés des images sélectionnées.

jq --slurpfile picks anchors.json '.contextFrames = [.contextFrames[0]] + $picks[0]' flight-request.json > selected-request.json
mv selected-request.json flight-request.json

Soumettez le chemin complet en une seule opération.

worldlabs tasks run atlasGenerate --request flight-request.json --wait --timeout 1800 --json > flight.json
worldlabs operations download "$(jq -er '.id' flight.json)" --out frames
ffmpeg -framerate 24 -i frames/frames_%03d_image.jpg -c:v libx264 -pix_fmt yuv420p -movflags +faststart shot.mp4

Inspectez le début, la plus grande ligne de base, le dévoilement et la fin, puis regardez le clip à vitesse réelle. Si le déplacement ressemble encore à un zoom, gardez la lentille fixe et augmentez le déplacement latéral près d'un bord de premier plan soutenu. Faites correspondre la position d'extrémité, le cap, la lentille et la vitesse lors de la jonction de deux mouvements destinés à sembler continus. Optionnel --footfalls ajoute un léger mouvement de marche pour les plans de marche.

Lorsque vous comparez des ensembles d'ancres, effectuez le rendu de la même requête dense deux fois, en changeant uniquement contextFrames. Si vous avez révisé la trajectoire pendant l'exploration, réexécutez les anciennes ancres sur cette trajectoire révisée. Utilisez une opération distincte par requête, sauvegardez les requêtes et vérifiez que la suppression de contextFrames laisse un JSON identique. Affichez des images synchronisées aux mêmes horodatages, en particulier au virage ou au dévoilement. Avec l'amélioration de prompt activée, inspectez le promptUsed des deux réponses : les images sélectionnées peuvent modifier la description améliorée. Pour une expérience qui maintient également le texte effectif fixe, réutilisez une description avec enhancePrompt: false sur les deux exécutions. Des rendus indépendants peuvent encore varier.

Dans l'exemple de la plage Tide Organ, deux passages API ont produit 40 images à 20 poses. Dix-sept choix ont couvert l'approche, la voûte nervurée, le surf ouvert et la vue inversée du rivage. Le tuyau en cuivre était un point de repère utile pour juger de la continuité pendant le virage au large.

Skills associés