Robinwood

Build guides Guide 2

Adding objects to a terrain design

Catalog assets, fit objects to the ground, protect paths and existing work, package dependencies, and test an OAR merge.

6 pages · companion skill $opensim-terrain-object-placement

Turn terrain into a usable environment with measured placement, protected routes and a complete asset package. Use the same process for a planted landscape or a neatly arranged mesh library.

Robinwood project example. This plan was generated from placement data. It is a layout diagram, not an in-world screenshot.
Robinwood project example. This plan was generated from placement data. It is a layout diagram, not an in-world screenshot.

What you will make

An asset catalog, placement manifest, exclusion map, read-back previews and an OAR containing the intended objects and dependencies. Use $opensim-terrain-object-placement. Guide 1 supplies the terrain master; Guide 3 supplies new mesh assets.

Choose the scope first

A full region package can contain terrain, settings and parcels. An object-only addition contains the selected objects and assets. For a library, arrange parts close enough to browse while keeping them disconnected and clear of one another.

Page 2Catalog assets and protect the design

Set up the session

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].

Inspect before placing

Supply the final terrain and its axis metadata, the asset folders, the destination size and the intended area. Have Codex inspect object bounds, original transforms, contact points and texture dependencies. The asset origin may be far above or beside its ground contact.

Protect existing work

Mark buildings, doors, paths, water, parcel constraints and objects that must stay untouched. When replacing generated content, identify the exact prior generated set using its manifest or IDs. Appearance and object names alone do not prove which additions are safe to remove.

Prompt to copy

Prompt to copy

Use $opensim-terrain-object-placement. Read the final heightfield and asset catalog. Add a woodland layout with open paths and clear building entrances. Preserve everything outside the marked new-work area. Make a reproducible placement manifest and north-up preview first. Package only the approved new objects and their assets in an OAR; exclude terrain, region settings and parcels.

RecordWhy it matters
Asset key and sourceFind the exact mesh and its dependencies
Bounds and contact pointPlace the base at the surface
Rotation and scaleReproduce the complete transform
Collision and scriptsSeparate scenery from interactive parts
License and creatorPreserve permitted reuse and metadata

Page 3Place objects on the actual ground

Placement schematic. An object origin is not necessarily its base. Solve the transformed contact point and then check the full footprint.
Placement schematic. An object origin is not necessarily its base. Solve the transformed contact point and then check the full footprint.

Sample the correct surface

Use the final terrain heightfield and bilinear sampling between grid points. Reject locations beyond the region or valid sampling area; silently clamping coordinates can pile objects onto a border. If a deck or mesh is the support surface, terrain height alone is insufficient.

Account for the pivot

For local contact point c, scale S, rotation R and intended world contact g, root translation is t = g − RSc. For an upright object with a bottom at local Z = −2 m, unit scale and ground at 21 m, put its root at Z = 23 m.

Check more than one point

Large building footprints need corner and edge samples. Keep houses and tree trunks upright; use grading or supports where necessary. Groundcover can follow a limited slope. Applying the terrain normal to a whole house usually creates a tilted floor.

Prompt to copy

Prompt to copy

Show the root position, transformed contact point and ground height for three sample objects. Check all footprint corners. Flag floating bases, buried entrances and out-of-region extents before placing the full set.

Page 4Keep routes clear and libraries organized

Illustrative planting plan. Trees stay outside the path buffer, building footprint and entrance. Use exclusion shapes and spacing rules before random placement.
Illustrative planting plan. Trees stay outside the path buffer, building footprint and entrance. Use exclusion shapes and spacing rules before random placement.

Plant with repeatable rules

Set a random seed, density, minimum spacing, allowed elevation and slope. Exclude roads, entrances, water and protected footprints. Vary approved species, scale and yaw within sensible ranges. Record rejected candidates and final counts so a revision can be compared.

Connect travel meshes deliberately

Use each part’s authored connector position and direction. Align the selected new connector to the existing one. If the free end follows terrain, preserve the join and check the entire deck clearance. A rigid piece may need a ramp variant or support; moving one endpoint cannot arbitrarily reshape it.

Use bounds for library rows

Place each object using its rotated width and depth plus a gap. Check the complete footprint against region limits. A single fixed center spacing makes large curves or tall bridges collide. Store the staging origin, row assignments and bounds in the manifest.

Prompt to copy

Prompt to copy

Arrange the kit in rows near the specified staging point, disconnected with a 2 m gap between complete footprints. Show row extents and names. Stop and report any piece that cannot fit inside the staging area.

Page 5Package objects and contents boxes

Archive dependency schematic. Every referenced mesh, material, image and inventory item must resolve. A material asset and its texture images are separate dependencies.
Archive dependency schematic. Every referenced mesh, material, image and inventory item must resolve. A material asset and its texture images are separate dependencies.

Use the working OAR pipeline

Our project writes serialized scene objects and native assets into an archive, then reopens it. Collada is an upload interchange file; renaming a DAE to a native mesh asset does not convert it. Preserve material bindings, part transforms and creator/permission metadata.

Prepare useful boxes

Give each building or asset family its own named box. Include reusable textures, PBR materials, AO maps, LSL scripts and a contents list. Use names such as Barnhouse_Wall_BaseColor and Barnhouse_Wall_PBR. Split a very large library into smaller logical boxes if inventory retrieval is slow.

Check assignment as well as presence

Having a PBR asset in the archive does not mean it is applied to the right face. Verify face-to-material assignments, material-to-image references and the box task-inventory records. Compile scripts where the target engine is available and test door bindings after import.

Prompt to copy

Prompt to copy

Reopen the final OAR and check all object, mesh, PBR, texture and inventory references. Report missing assets, duplicate IDs, out-of-region bounds and unintended terrain/settings/parcel entries. Render the decoded export, not just the source scene.

Page 6Merge and inspect the result

Test the smallest useful batch

Confirm region dimensions and current simulator merge options. Start with a few representative objects, a contents box and an interactive door. Back up the destination. The following is a simulator-console example; substitute the real test region and server path. OAR merge behavior is documented by OpenSimulator [3].

change region Object Test
save oar Object-Test-before.oar
load oar --merge /server/path/objects-only.oar

Understand repeated loads

Merge does not identify replacements by matching names or positions. Rebuilt objects with new IDs can duplicate an earlier set; behavior for existing IDs depends on the simulator and options. Use the recorded prior manifest for an explicitly authorized replacement.

Walk and interact

Check bases, path continuity, slopes, stair access, doorway clearance and performance. Confirm PBR under neutral lighting and inspect fallback textures. Open every contents box and retrieve representative assets. Test door open, close and reset behavior after the linkset is fully available.

Resolve failures narrowly

Floating objects: recheck local base offset and terrain version. Blocked routes: inspect collision shapes and exclusion buffers. Missing materials: follow the full material-to-image reference chain. Hanging box inventory: inspect inventory types, permissions and server logs, then retest a small box. Do not repeatedly merge the whole set.

Keep an audit trail

Deliver the placement manifest, sources, archive checksum, validation results and exact live-test status. A full asset catalog is useful, but does not prove every placement was visually inspected.

Sources and project examples

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

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

[3] OpenSimulator archive documentation: https://opensimulator.dev/wiki/OpenSim_Archives

Project evidence: tools/build_robinwood_populated.py; output/robinwood-full-v4/placements.json; output/robinwood-houses-repair-v3/Source/package_oar.py. Original full-region builders are examples, not safe defaults for additive jobs.