Ask SDXL for the inside of a spinning space habitat and you get a tunnel, a greenhouse, or a field with a sky. It has seen Earth, and almost nothing else. The inside of a giant rotating ring, with land curving up ahead of you, no horizon and a glass roof overhead, is a shape it has barely ever seen.
So I stopped trying to prompt it and built the pictures first. This is how I made Solarum Ring Habitat XL, including the parts that failed. The failures taught me more than the wins.
Short version: build the shape in 3D, paint it in sections, caption only what changes, and keep the prompt close to how the training pictures were framed.
1. Let the physics set the picture rules
The ring is about 10 km across. To give Earth-like weight it turns once every 2.4 minutes, and the weight comes from the spin. That gives firm rules for every picture:
The land ahead of you rises. Walk 2 km and the ground has climbed about 400 m.
There is no horizon. The floor curves up and disappears behind the roof.
The floor is a valley about 1.3 km wide, with walls on both sides and a glass roof about 600 m up.
I chose that size on purpose. Smaller rings (a valley about 100 m wide) read as a garden, not a world.
2. Build the shape in 3D, because depth alone isn't enough
A small ray-marched model of the ring gave depth maps for SDXL's depth ControlNet. The shape held at every strength. But at this size, the far land is too far away for a depth map to carry any detail, and SDXL filled every smooth surface with crop rows.
The fix was to give the model real ground. I rendered 24 straight-down aerial tiles (fields, food forest, villages, rivers, wetland), stitched them into one land map, and wrapped it over the 3D ring. Those were the first pictures that felt grand. Later I added 3D tree canopy as well, because the model kept painting smooth ground as fields.
3. Paint in sections, not all at once
An img2img pass over the whole render failed three ways: fog, a flat lawn, or a painterly lawn. SDXL doesn't know what to do with a picture this strange.
What worked: render at double size and cut it into six overlapping 1024 squares. Each square, on its own, looks like an ordinary aerial photo, which SDXL paints well. Polish each one at denoise 0.55 with a depth ControlNet, then blend them back together.

Left, the 3D model's render. Right, the same view painted in six sections.
4. Don't caption what's in every frame
My first ring LoRA (48 pictures) had the roof, the spokes and the glass in every caption. It learned nothing from those words: the ring only appeared when the prompt said "glass roof", and the trigger alone gave flat green land.
The roof is in every picture, so it belongs to the trigger. Captions should name only what changes between pictures. In the final set that's the height of the view, a flat or hilly floor, what is in the foreground, and the light.
5. A LoRA learns the view it was shown
Removing those words from the captions brought the roof back, but in only one kind of view. The real fix was a better set: 62 pictures, mostly low views looking along the ring, with flat and hilly floors and three kinds of light. That version drew a convincing ring, but only when the prompt matched its training pictures.
6. If you want content, it has to be in the training set
The second version drew the ring over empty fields. A second pass couldn't add forests or houses that weren't there. So for v3, I polished each ground square with one kind of content: food forest, village, or willow river. Two things went wrong on the way:
Orchard rows never worked. They turned into terraces in every test, so I dropped them.
Brown ground near the camera came back as a mud yard with sheds and cars. I greened it in the 3D model.
32 views, painted twice, made 64 pictures. I kept 62 and cropped 12 to cut out problems.

Left, a training picture. Right, what the LoRA draws from a prompt: the same structure, much softer.
7. The frame is the key
This prompt is the frame. It matches how the training pictures were made:
jring_habitat, low view, looking along the ring, level terraced fields and straight water channels, bright daylight, landscape photograph
At weight 0.9, keep the frame and add one thing at a time: a food forest, a village, autumn, evening light, a river. The roof, walls and rising land held in all 42 of my test pictures. v3 also adds more than v2 did: tree canopy where v2 left bare fields, and dappled autumn colour where v2 painted flat blocks.
Leave the frame out and write only about the content, and the content wins. You get a lovely autumn forest or a green-roofed town, and no ring.

Same frame, one change per row. Columns: v2, then v3 at epochs 4 and 6, two seeds each. The ring holds in every picture.
8. Sharpness costs scale
The LoRA's pictures are soft. A second pass without the LoRA makes them crisp, and the roof and walls survive. But up close the scale collapses: the roof turns into timber beams a few metres up, and the land becomes a lawn under a garden pergola. The softness was hiding it. The base model only knows small glass buildings, so when it adds detail, it adds small detail.

Left, the LoRA's soft picture. Right, a sharp second pass, where the habitat shrinks to a pergola.
For pictures that are both sharp and grand, I still render the 3D model and paint it in sections. The LoRA is for sketching the structure fast.
What I'd tell anyone trying this
If the base model has never seen the shape, build it in 3D and paint over it. Don't fight the prompt.
When a picture is too strange for SDXL, cut it into pieces that each look ordinary.
Caption what varies. Whatever is in every picture belongs to the trigger.
Keep a whole set to one kind of view, and prompt in that view.
Content the LoRA should draw has to be in the training pictures. A second pass won't invent it.
Test one change at a time against a fixed frame. It's the only way to see what the LoRA actually learned.
The model
Solarum Ring Habitat XL v3.0 is up, labelled experimental. Trigger jring_habitat, weight 0.9, with the frame prompt above. Trained on Juggernaut XL v9: kohya sd-scripts, LoRA dim 32 / alpha 16, UNet only, 768 px buckets, AdamW8bit, cosine, LR 1e-4, epoch 4 (930 steps over 6 epochs). The training pictures are my own 3D renders painted with Juggernaut XL v9 on my own machine, with no other models' outputs and no photos of real places.
Next: the same ring seen from outside, made from the same 3D model.
Made with AI. Part of my visual research for Solarum, a novel I'm writing: signalofsolarum.substack.com · deviantart.com/signalofsolarum



Comments