Robinwood

Build guides Guide 1

Terrain design and LLRAW export

Create a heightfield, preserve meter scale and orientation, encode and verify LLRAW and R32, then test a terrain import.

6 pages · companion skill $opensim-terrain-llraw

Build an editable landscape from a measured brief, then export terrain that can be checked and loaded into OpenSimulator. Start with the float heightfield and keep it as the master for later revisions.

Robinwood project example. One 1024 by 1024 meter varregion, shown north up with a 4 by 4 tile grid. This is a generated terrain preview.
Robinwood project example. One 1024 by 1024 meter varregion, shown north up with a 4 by 4 tile grid. This is a generated terrain preview.

What you will make

A float master, 13-channel LLRAW, R32 terrain, labeled previews and a manifest recording scale, axes, water and validation. LLRAW carries terrain samples; objects and their textures are packaged separately.

How to use this guide

Pages 2 to 6 cover the brief, landform design, encoding, a runnable exercise and the import check. Use $opensim-terrain-llraw for this workflow. Continue with Guide 2 when the terrain is ready for trees and buildings.

Page 2Set up the project and the brief

Start in Codex

Use Codex with GPT-6 Astra selected in the model control available to your account. Open a local project folder so the agent can inspect inputs, run tools and save results. These guides use a local Python and Blender workflow; a chat response alone does not execute an export. OpenAI identifies the API model as gpt-6-astra [1]. To install the companion skills, ask Codex to review the extracted Skills folder and install its three skill folders in your user skill directory, preserving any newer local versions. Open a new chat and ask it to confirm the named skill is available [2].

Prepare the tools

Give Codex a writable project folder. Ask it to check Python, NumPy and Pillow, and identify the target OpenSimulator version and terrain loaders. Use the supplied skill folder; ask Codex to confirm that it can find and read the named skill. Skills store reusable instructions and supporting files [2].

State the terrain contract

Specify width and height in meters, sample spacing, water height, north direction, maximum elevations, shoreline, building pads and paths. Say whether 4 by 4 means one 1024 meter varregion or sixteen separate 256 meter regions. Heights stay in meters when the horizontal design is enlarged.

Prompt to copy

Prompt to copy

Use $opensim-terrain-llraw. Design one 1024 by 1024 meter OpenSim varregion at one sample per meter. Water is 20 m. Put a sheltered bay in the southeast, wooded hills in the northwest, and a 40 by 30 m building pad at 27 m. Keep the main route below 10 percent grade as a design target. First save a labeled plan and parameter file. Then create the float master, LLRAW, R32, slope map and validation report. Work locally; do not load a region.

InputExample or decision
ReferenceAttach a map and identify three coordinate anchors
AxesX east, Y north, Z in meters
Protected contentExisting terrain areas or objects to retain
OutputVersioned folder with source and import notes

Page 3Shape landforms before fine detail

Design schematic. Feather a building pad into the hillside; use separate mesh geometry for a bridge. Water elevation and ground elevation are different values.
Design schematic. Feather a building pad into the hillside; use separate mesh geometry for a bridge. Water elevation and ground elevation are different values.

Build in a deliberate order

Establish the coast and seabed, broad hills, drainage, then pads and routes. Add gentle local variation last. Smooth locally so a path does not become terraced while a deliberate cliff remains intact. The Robinwood generators use broad elevation fields, blended pads and channel masks.

Measure the route

Grade is rise divided by horizontal run. A 2 m rise over 20 m is 10 percent, not 10 degrees. Ask for a route profile and checks of the complete width. Choose a grade target for the experience and test it in the viewer; it is not a universal simulator limit.

Respect what terrain can represent

A heightfield stores one ground height at each XY sample. Caves, roofed passages, overhangs, stacked floors and bridges need meshes. Ordinary region water does not automatically make a separate high pond surface just because the map colors it blue.

Prompt to copy

Prompt to copy

Show a north-up relief map and slope map. Mark pad dimensions, shoreline elevations and any route segments exceeding the requested grade. Keep the float master and list every assumption before the next revision.

Page 4Choose and verify the terrain format

The same design can produce several files. Keep the meter-valued master separate from the preview and the encoded import files.
The same design can produce several files. Keep the meter-valued master separate from the preview and the encoded import files.

Make the encoding explicit

The project LLRAW decoder reads height = byte 0 × byte 1 / 128. Holding byte 1 at 128 gives integer-meter heights. The supplied helper chooses the nearest representable pair and reports the error. Its supported height range is 0 to 508.0078125 m; reject out-of-range input rather than wrapping bytes.

Check the actual bytes

A 1024 square LLRAW is 13,631,488 bytes; a 1024 square R32 is 4,194,304 bytes. File names ending in .raw can describe different encodings. Record dimensions and orientation because these formats do not store a useful image-style header.

Keep orientation consistent

In our arrays h[y,x], row zero is south and X changes fastest. Flip vertically once for a north-up image. Do not also flip the exported data. Use a visibly asymmetric hill or bay to prove orientation after import.

FormatMeaning and check
LLRAW13 unsigned bytes per sample in this project profile
R32Little-endian float32 meters, 4 bytes per sample
NPYEditable NumPy master with array dimensions
PNGPreview or calibrated height image; not inherently meters

Page 5Run the small terrain exercise

Open the companion folder

The download includes Examples/make_training_terrain.py and the terrain skill helper. Run the following commands in a terminal from the extracted guide folder using a Python environment with NumPy. Codex can run these commands for you and explain the results.

python Examples/make_training_terrain.py
python Skills/opensim-terrain-llraw/scripts/terrain_io.py self-test
python Skills/opensim-terrain-llraw/scripts/terrain_io.py export Examples/Training-Terrain/height.npy Examples/Training-Terrain/Export --water 20
python Skills/opensim-terrain-llraw/scripts/terrain_io.py inspect Examples/Training-Terrain/Export/terrain.llraw.raw --width 256 --height 256

What to inspect

The exercise makes a 256 by 256 meter island with a northwest hill and southeast inlet. The generator saves height.npy and parameters.json. The exporter saves terrain.llraw.raw, terrain.r32 and terrain-manifest.json. Check the maximum decode error, minimum and maximum heights, byte counts and hashes.

Revise with a focused prompt

Ask Codex to lower only the northwest hill by 5 m, retain the coastline and pad, create a new version and compare the two heightfields. A numerical difference map shows whether the change stayed inside the requested area.

Split only when the destination needs tiles

For sixteen regions, slice one continuous 1024 master into sixteen 256 tiles. Use x0 y0 for the southwest tile and document tile offsets. Reassemble the tiles and compare against the master. Neighboring samples are one meter apart; slopes need to be continuous, not forced flat at every boundary.

Page 6Load a test region and complete the checks

Before loading

Use a disposable test region configured to the intended dimensions. A terrain file cannot enlarge an existing 256 meter region. Confirm the installed terrain loader using simulator help; this project uses .raw for LLRAW and .r32 for float terrain. Back up the selected region first.

Simulator console example

These commands belong in the OpenSimulator console, not the operating-system terminal. Replace the region name and server file path. Use only one of the two terrain formats in a test so the result is unambiguous.

change region Terrain Test
save oar Terrain-Test-before.oar
terrain load /server/path/terrain.llraw.raw

Verify in world

Confirm north and south landmarks, water at the intended height, pad levels, shorelines and region seams. Walk the routes and check camera clearance. The LLRAW water byte is not a promise that the simulator will change its water setting; check region settings separately.

When something looks wrong

Mirrored map: inspect row direction and flips. Terracing: inspect quantization and the original float master. Wrong scale: verify region dimensions and loader format. Tall spikes: check byte length, finite source data and the selected loader. Wrong waterline: check server water elevation.

Completion evidence

Save the source, parameters, preview, LLRAW and R32, decoded report and import notes. Mark checks as offline or observed in world. Never label a successful file write as a successful simulator import.

Sources and project examples

[1] OpenAI GPT-6 Astra model reference: https://developers.openai.com/api/docs/models/gpt-6-astra

[2] OpenAI Build skills: https://learn.chatgpt.com/docs/build-skills

Project evidence: tools/generate_robinwood_llraw.py; tools/generate_robinwood_4x4.py; terrain-work/generate_terrains.py. The companion helper documents its project-specific LLRAW profile. Review target-loader behavior before deployment.