skybox-panorama is a skill from the Summer skill library: a guide your AI agent reads when the task matches, so it builds the good version on the first try. Generate a 360-degree sky panorama and wire it as a PanoramaSkyMaterial Sky resource on WorldEnvironment.
When your agent uses it
- Generating a 360-degree panoramic sky image for use as a Sky resource (PanoramaSkyMaterial) in a 3D scene
- A 3D scene has a flat or default sky and needs a 360-degree backdrop matching the art direction
Install
summer setup installs every skill for your agent. To add only this one:
claude-code for your agent, such as codex or cursor. See Skills for every option.
The skill
This skill generates a single equirectangular panoramic image (2:1 aspect, e.g. 2048×1024 or 4096×2048) suitable for Summer Engine’sPanoramaSkyMaterial. It wires the image into a Sky resource on a
WorldEnvironment node so the sky is visible from every camera angle.
The most common failure is non-equirectangular output. Image models default to flat scenes. Without an explicit “equirectangular projection”, the result looks fine as a thumbnail but distorts when wrapped onto a sphere: the horizon bows, the zenith pinches, and the sun smears. The prompt suffix and import settings below give a usable sky in one or two tries.
When to use
- “Generate a fantasy sky for the level.”
- “I need a sci-fi nebula skybox.”
- “Make a sunset panorama for the desert scene.”
- “Stormy night sky for the haunted level.”
- The 3D scene needs a visible sky (not just a flat color background).
When NOT to use
- The user wants a 2D parallax background → that’s a separate
Sprite2Djob, not a panorama. - The user wants a HDRI for environment lighting (not just visual sky) → AI panoramas are LDR by default. For real IBL/HDR, use Polyhaven HDRIs (free CC0). Mention this to the user if lighting realism matters.
- The user wants a 3D-modeled sky-dome with geometry (clouds-as-meshes) → out of scope; use a
Spheremesh + custom shader. - The scene is 2D → no sky needed.
Steps
1. Search for an existing sky
polyhaven.com/hdris) hosts hundreds of free CC0 HDRIs. They look more realistic than generated skies and carry real HDR lighting data. Prefer Polyhaven for realistic exteriors; generate for stylized, fantasy or sci-fi skies.
2. Build the prompt — sky description + equirectangular suffix
Pattern:360 degree panoramic equirectangular projection— primes the model for the right format.seamless horizontal wrap, no visible seam at left and right edges— the left and right edges of the image meet when wrapped. If they don’t match, you see a vertical seam in the sky.no foreground objects, no ground horizon line— skies show only sky. If you include a horizon, it warps weirdly when sphere-mapped and kills the illusion that the sky is at infinite distance.distortion-correct for sphere mapping— reminds the model that the top/bottom of the image map to the zenith/nadir.
3. Generate, then fix the aspect yourself
Equirectangular MUST be 2:1 (width = 2× height).assets.generate_image has no 2:1 aspectRatio: the closest are 16:9 and 21:9. Generate at 16:9. For a larger sky, leave model out and add width: 2048, height: 1152: a model that reaches that size is picked.
width and height. Then one of these has to happen before the image is usable as a panorama:
- Crop the 16:9 result to 2:1 by trimming the top and bottom (about 11% of the height) before importing. The width stays whole, so the horizontal wrap the prompt asked for survives; the zenith and nadir are the least informative regions of a sky anyway.
- Or generate in the Summer dashboard, which offers 2:1, and bring the result back with
summer_import_from_url. - Or use a Polyhaven HDRI, already 2:1 and better for realistic exteriors.
PanoramaSkyMaterial panorama and call it done — it wraps with obvious horizontal compression. Never crop the sides: that breaks the seamless wrap.
4. Verify the seam and projection
Before wiring, inspect:- Left edge ↔ right edge: mentally place them side-by-side. They should match continuously. If there’s a cloud cut in half on the left and a different cloud on the right, regenerate with stronger emphasis on
seamless horizontal wrap. - Top stretching: the top 10% of the image stretches enormously when mapped to the zenith. If there are tight features (a sun, a cloud edge) high up, they’ll smear. Generations with diffuse, soft top regions wrap better than crisp ones.
- Bottom: same applies to the nadir. Most skies don’t show much bottom anyway since the camera sits below the horizon — but avoid generating tight features at the very bottom.
seed for variation while keeping prompt — bump the seed.
5. Import to project
Repeat: Disabled(panoramas don’t tile — they wrap once via the material).Filter: Linear with mipmaps(smoother as the camera turns).Mipmaps: Enabled.Compress: VRAM Compressedfor ship.
6. Wire into WorldEnvironment
summer_set_resource_property reaches exactly one level into a resource — it takes scenePath, nodePath, resourceProperty, subProperty, value, and there is no "a:b:c" colon-path form for walking Environment → Sky → SkyMaterial. Write the Environment (with its Sky and PanoramaSkyMaterial as sub-resources) as a .tres, then attach it in one property set:
scenePath; node paths are relative to that scene’s root (./), not absolute /root/... runtime paths.
Note: AI-generated panoramas are LDR (8-bit per channel). For physically-correct IBL with bright suns, the lighting is muted compared to true HDRI. Mention this to the user if they expect strong IBL.
7. Verify in scene
summer_play and look around. Sun in the right place? Seam invisible? Top/bottom okay?
Prompt patterns
Bad prompts (and why)
Anti-patterns
- Including foreground or horizon. Mountains, trees, buildings at horizon level warp weirdly when sphere-mapped (the “swimming horizon” effect). Skies show ONLY sky. If the level needs distant mountains, model them as low-poly meshes in the scene, not in the sky texture.
- Assuming the image is 2:1.
aspectRatiohas no 2:1 value; read the returnedwidthandheight. A 1:1 or 16:9 panorama wrapped equirectangular has obvious horizontal compression. Crop the top and bottom, or generate in the dashboard where 2:1 exists. - Tight features at zenith/nadir. Anything in the top or bottom 10% of the image gets pinched. Bias toward soft, diffuse features there.
- Expecting HDR / IBL quality. AI panoramas are 8-bit. If the user needs realistic environment lighting from the sky, point them at Polyhaven HDRIs (CC0). AI is for visual sky, not for lighting.
- Forgetting
Repeat: Disabledon import. Panoramas wrap once via the material; ifRepeatis on, you can get duplicate-tile artifacts at the seam.
Edge cases
- Animated sky (clouds drift). AI gives one frame. Animate via shader (UV scroll on the panorama texture) or layer two panoramas with
ProceduralSkyMaterialfor the base + a transparent cloud layer. - Day/night cycle. Generate two panoramas (day + night). Cross-fade the
sky_materialvia shader blend or by swappingpanoramaover a tween. Two LDR panoramas + a blend = serviceable cycle. - First-person VR. AI panoramas at 2048×1024 are too low-res for VR (visible pixels). Generate at 4096×2048 if the model supports it; otherwise use Polyhaven HDRIs at 8K.
- Indoor scene. Skyboxes are wasted indoors — use
BG_COLORor a flat black background. Don’t generate a sky for a windowless dungeon. - Visible vertical seam after generation. Fix in Photoshop/GIMP:
Filter → Other → Offsetby 50% horizontally → the seam moves to the center → heal with content-aware fill or clone stamp → offset back to 0. Or regenerate with seed bump andseamless horizontal wrap, no visible seam at left and right edgesrepeated twice in the prompt.
Without Summer Engine
In a session without Summer Engine tools (the assets profile; thesummer-assets skill has the whole loop), do steps 1-4 and skip steps 5-7 (import, WorldEnvironment, scene check). Pass out with the person’s folder so the image lands there (the summer-assets skill says how). Tell them it is a 2:1 equirectangular panorama, the shape most engines take for a sky.
Fallback (no MCP)
Print the call:vertical seam, foreground, distorted, warped, characters, buildings, then summer_import_from_url to res://art/sky/<name>.png, set Repeat: Disabled, and wire the WorldEnvironment.
If MCP is offline entirely: Polyhaven (polyhaven.com/hdris) has hundreds of free CC0 HDRIs ready to drop into PanoramaSkyMaterial, and often the better choice for realistic exteriors.
Handoff
After the sky is wired:- Add atmospheric fog matching the sky’s mood →
scene-composition(fog is on the same Environment resource). - Add a directional
DirectionalLight3Dmatching the sun position in the panorama →3d-lightingfor sun + shadows. - Day/night cycle → re-invoke this skill for the night sky, then write a small tween between the two
panoramaproperties. - Tileable ground texture for the level floor →
tileable-texture.
See also
3d-lighting— sun, ambient, fog wired alongside the sky.tileable-texture— ground/floor counterpart.scene-composition— WorldEnvironment placement and configuration.asset-strategy— meta-router.summer_docs_readidreference/mcp-tools-reference— how to callassets.generate_image.
From a shell
No Summer MCP tools in this session? Run each one as a command; whensummer --version is missing or below 4.0, use npx -y summer-engine@latest in place of summer. Fields are flags in kebab-case (--scene-path res://main.tscn) or one --input '<json>', and summer ops describe <op> prints the exact input. The summer-cli skill has the rest.
Related skills
tileable-texture: Generate a seamless tileable texture for walls, floors or terrain, wired as a StandardMaterial3D albedo.asset-strategy: Route any ‘I need a [thing]’ asset request to the right skill: 2D, 3D, audio, video, VFX or animation.
Source:
library/skills/skybox-panorama/SKILL.md, rendered from summer-engine@4.3.0 on npm.
