Vector & OBJ Export

← TerrainStudio Manual

These passes export the map's real-world features — coastlines, country borders, water, buildings — as editable line geometry or true 3D mesh instead of pixels. Every pass lands in the exact same frame as your terrain and imagery, so a coastline spline sits precisely on the satellite shoreline and a building drops onto its displacement. None of these sources need a Mapbox key — a vector-only scan is fully keyless.

Two kinds of output

The prefix on the pass name tells you what you get:

  • Vector —  =  SVG splines. Editable paths (borders, coastline, water, banded buildings). Import into C4D as spline objects and extrude / sweep them.
  • OBJ —  =  OBJ mesh. Real 3D geometry (exact-height buildings). Drop-in — no extrude needed.

Where the lines come from: Natural Earth vs OSM

Two source tiers, mirroring the elevation tiers (Mapbox 30 m → GPXZ lidar). Pick by frame size:

SourceScaleUse forLimit
Natural Earth
(Country Borders, regional Coastline)
1:10M, regional Continents, countries, big regional frames None (cached, keyless). Coarse up close — a city coastline comes in blocky.
OSM / OpenStreetMap
(Coastline + Water, Buildings)
Survey / city detail Cities, hero frames — every pier, inlet, river, footprint Fetched live via Overpass; times out on large frames.
OSM size warnings. Overpass (the OSM query service) chokes on big areas. Coastline + Water warns above ~80 km; Buildings above ~15 km (footprints get dense fast). Above those, use Natural Earth for coastline, or tighten the frame. Results are cached per area, so a repeat of the same frame is instant.

The frame rectangle — the key to a clean import

The single most important setting. Add frame rectangle draws a rectangle at the exact frame edges into the export. It gives C4D a known reference the size of your whole frame, so on import the object centers on the frame with its pivot at the origin — and you can scale until the red frame rectangle matches your plane's edges, which makes the fit exact every time instead of eyeballing. It also doubles as a border element you can keep or delete.

Leave it on for C4D. Nearly every alignment headache below is solved by matching the frame rectangle to the plane rather than trusting a scale number.

Importing SVG (Vector) into Cinema 4D — and the ×1.5 quirk

  1. File → Import the .svg. In the import dialog turn Center XY on.
  2. Set the imported object: Position 0, 0, 0, Rotation Pitch −90°. (SVG imports standing up on the XY plane; −90° lays it flat on your terrain.)
  3. The ×1.5 quirk: C4D's SVG importer applies its own ≈1.5× scale to the artwork. So to match a plane of size N, set the Vector Import Height = N × 1.5 (e.g. a 2000 cm plane → Height 3000). Or skip the math: just scale Height until the red frame rectangle lines up with the plane edges — always exact, quirk or not.
  4. The splines now sit pixel-aligned on the terrain. Extrude the coastline into a landmass, sweep the border into a ridge, etc.
"It imported tiny / rotated / standing up." That's the SVG default — apply Pitch −90° and scale Height (×1.5, or match the frame rectangle).

Importing OBJ buildings into Cinema 4D

Since v261 the mesh carries UVs and flat normals. The UVs are measured in real metres — u runs around the footprint, v runs up the wall — so one facade shader is scaled correctly on a cottage and on a tower with no per-building tuning. Roofs and floors are mapped by ground position, in the same metres. The normals are flat and explicit: without them an importer computes its own and smooth-shades the box, which rounds every corner off.

The exact-boxes buildings pass is a different animal — real mesh, not splines, and it behaves better on import. It's generated Y-up with footprints in the XZ plane, so it comes in flat on the terrain with no rotation and no extrude — none of the SVG Pitch −90° dance. Each building already carries its true height from OSM.

  1. Import the .obj. It lands flat and upright.
  2. Scale the single object uniformly until it matches your plane (gauge with the frame rectangle or the World size below).

One object, up to hundreds of thousands of buildings (all of Paris in one mesh), true-scale heights, n-gon caps. Drop-in.

Google 3D Tiles — the textured OBJ

The GOOGLE TILE pass is an OBJ too, imported the same way: flat, upright, no rotation, same scale as the buildings OBJ. The difference is that it's one continuous textured surface — ground, trees and buildings together — written as <name>_google3d.obj with its .mtl, a handful of 4K texture pages and a .json sidecar. Keep those files together when you move them.

  • Needs your key: a Google Maps Platform key with the Map Tiles API enabled (Settings → API Settings). Each scan is one billed request; Google gives 1,000 free a month.
  • Detail follows the frame: a few city blocks get Google's finest (about 16 cm texture); wider frames get lighter levels. It stops at 5 km. Settings → Detail chooses Full, Lighter (about a quarter of the triangles) or Background (about a sixteenth) — for plates that sit out of focus.
  • The look: the photo carries Google's sun and shadows. Put the texture in Luminance (Emission in Redshift) for the true photographic look, or keep it in Color if you want your own lights on top.
  • Height: y = 0 is the frame's lowest ground. The sidecar's elevation_datum_m is that ground's real sea-level height, so it can sit on your displacement.
  • Licence: Google's data under Google's terms. Clearing its use — broadcast, film, commercial — is yours; the app asks you to acknowledge that once.

Blender, Maya, Unreal, Unity

Any app that reads OBJ reads this one. The .mtl finds the textures through tex/, so keep that folder beside the OBJ.

  • Scale: the OBJ is in scene units, not metres — by default the frame is as wide as its pixel width. Set World size before you scan to get real units. It's in cm, which Maya and Unreal use as-is; Blender and Unity work in metres, so import at a scale of 0.01. Or scale by the sidecar's scene_units_per_metre.
  • Blender: File → Import → Wavefront (.obj), default axes. It lands upright and textured.
  • Maya: Y-up, like the file. If the materials come in grey, point them at the tex/ folder with the File Path Editor.
  • Unreal: import the OBJ and turn on Nanite — a city frame runs to millions of triangles.
  • Unity: if the materials arrive white, drag each page JPG onto its material (one page, one material).
  • The look, everywhere: importers make a lit material, so your lights shade a photo that already has the sun in it. Plug the texture into an emission or unlit shader for the true look.

Buildings: banded SVG vs exact OBJ

Vector — OSM — Buildings (banded SVG) OBJ — Buildings (exact OBJ)
What Footprints bucketed into 7 height bands, one SVG file per band Every building at its real height, one mesh
Workflow Import each band file, extrude to the height in its filename (e.g. _buildings_04_68m.svg → extrude 68 m, ×1.5) Import once, scale to plane. No extrude, no per-band work.
Best for Uniform / stylized cities you want to art-direct as splines Dramatic real skylines (NYC, Paris) & fast drop-in

Building heights are ~87% real — from OSM tags (explicit height → building:levels×3 m → 8 m default where a building has no data). This per-building height is the key difference from tools that give every building one flat height.

Landmarks get modelled, not blocked out. A cathedral isn't one polygon in OSM — the outline is just the footprint (Notre-Dame's is tagged 10.5 m, the height of the side-aisle roof) and the real shape lives in separate building:part pieces: nave, towers, spire. Where a building has those, they're used instead of the outline, and each starts where it actually starts — so the flèche sits on the roof at 73 m instead of running down to the pavement. Ordinary blocks are a single polygon and come out exactly as they always did; this only shows up on the handful of buildings someone has hand-modelled. The banded SVG can't carry a starting height (they're flat splines you extrude from the ground), so that part is OBJ-only.

On accuracy — this is a starting point, not a survey. Heights come from OSM, and how much OSM knows varies enormously by city. On a city-centre frame you might find three-quarters of buildings carrying a real height in Manhattan, around two-thirds in Paris, and closer to one in eight somewhere like Jakarta. Everything without a height tag gets the 8 m default, so a lightly-mapped city comes out as a fairly even field of low blocks rather than a skyline. That isn't a fault to work around, it's the honest state of the data — and it's still a scaffold worth having: real footprints, at true scale, registered pixel-for-pixel with every other pass in the scan. Drop it into C4D and push the buildings you actually care about to the heights you want. If you need a literally accurate Jakarta, start here and fill it in; you were going to art-direct the hero massing anyway. The OBJ makes that easy to act on: it arrives in two groups, buildings_measured and buildings_assumed, so you can select every guessed block at once and leave the real ones alone.

World size (cm)

Sets the real-world size of the export. What it affects depends on the target:

  • OBJ: sets the actual geometry scale, so the mesh imports near 1:1 with your C4D plane (then fine-tune against the frame).
  • Non-C4D SVG apps (Blender, Illustrator): gives the SVG real units.
  • C4D SVG import ignores it — C4D uses its own Height field (the ×1.5 above), not the SVG's embedded size. So for C4D-SVG this setting does nothing; it exists for OBJ and other apps.
  • 0 = raw pixel units.

Contour Bands — traced from your own elevation

The one vector pass that isn't fetched from anywhere. It is traced from whichever elevation pass runs in the same scan, so it sits on the displacement map exactly — same array, same frame, nothing to align. If no elevation pass is configured it quietly fetches one. That also means it inherits your source: trace it off GPXZ lidar and you get lidar contours.

Regions, not lines. Each band is a closed area — everything between 1200 and 1300 m, say — so it extrudes straight into a terrace. Where higher ground sits inside a band the shape is a ring with a hole, and it exports that way (one path, even-odd fill), so it arrives as one object rather than a pile of unrelated loops.

The heights travel with the file. Each band's group is named band_1200_1300m and carries data-low-m / data-high-m, and the pass writes a metadata JSON listing every level. Your displacement scale is your own business — the tool hands over the numbers so you can map them onto whatever scale you are working at, rather than guessing your setup.

Interval is set per row and defaults to 100 m, which suits regional frames. A city frame usually wants 10 or 20 m. A large vertical range produces a lot of bands — a Full Depth frame spanning the sea floor can pass a hundred — and the pass says so rather than silently writing an enormous file.

Why every boundary appears twice: the hole in one band is the outer edge of the next, so the line between them belongs to both and is drawn for each. That is the price of every band being independently extrudable, not a fault in the export.

Other apps (Blender, Illustrator)

They read the SVG's embedded size — set World size for real units. They do not apply C4D's 1.5× scale; that quirk is C4D-only, so don't compensate for it elsewhere.

Gotchas & limits

  • OSM pass hung or failed → Overpass timed out on too large a frame. Shrink the area, or switch coastline to Natural Earth.
  • City coastline looks blocky → that's Natural Earth (regional). Switch to the OSM Coastline + Water for city detail.
  • Vector / OBJ passes are frame-wide — generated once against the whole frame. In Tile Scan they are not tiled; you get one file at full grid extent.
  • No Mapbox key needed — every vector/geometry source is keyless.

Questions or comments: studio@skylab5.com