VRML (.wrl) format: first web 3D standard 1994 — OSM export to legacy 3D

2026-05-2813 min read
3dweb3dlegacyvrmliso-standard

VRML — Virtual Reality Modeling Language — is the first international standard for delivering 3D scenes over the web. It was conceived in 1994, when the Web was still very young and consisted almost entirely of flat HTML, and the dominant browser Mosaic had just learned how to display inline images. Mark Pesce and Tony Parisi presented the idea at the first WWW Conference in Geneva in May 1994: a text format was needed to describe 3D worlds in the browser, analogously to how HTML describes text documents. By year-end a Silicon Graphics (SGI) team turned an extension of their Open Inventor format into the VRML 1.0 specification. Three years later, in December 1997, ISO ratified VRML97 as ISO/IEC 14772-1 — making VRML the first formally standardized 3D format for the web. On osm2cdr.ru vrml_exporter.py runs through Building3DExporter to emit classic VRML97 ASCII with IndexedFaceSet building polygons extruded by building:levels × 3 m and Material nodes for basic coloring — the format fits legacy archives, academic visualization, and old CAD pipelines.

Map generation of Paris city center

History: from Geneva 1994 to X3D

VRML's story begins at the first WWW Conference in Geneva in May 1994. Mark Pesce and Tony Parisi ran a BoF session, "Virtual Reality Markup Language", and the name quickly mutated to "Modeling Language" — because VRML described not text markup but three-dimensional scenes. Tim Berners-Lee blessed the idea: "the Web needs 3D". Silicon Graphics' team proposed basing it on their commercial Open Inventor format (1992), simplifying it and making it ASCII-serializable. By November 1994 the VRML 1.0 spec was out — a static format with basic primitives (Cube, Sphere, Cone) and an IndexedFaceSet for arbitrary polygons.

VRML 1.0 was static: you could look at a scene in 3D and spin it with the mouse, but no interactivity. Real Web 3D obviously needed animation and events — click an object, hover, timer. In 1995 the Web3D community ran a contest for VRML 2.0; SGI's "Moving Worlds" proposal won, adding Sensor nodes (TouchSensor, TimeSensor, ProximitySensor), Script nodes, and a ROUTE system for wiring events. VRML 2.0 shipped in August 1996, and in December 1997 ISO ratified it as ISO/IEC 14772-1:1997, officially named VRML97. From that moment VRML was the first international 3D-for-web standard.

The peak of VRML — 1996–2000. Silicon Graphics' Cosmo Player became the most popular VRML plugin for Netscape Navigator and Internet Explorer; Cortona3D and Blaxxun Contact fought for the rest of the market. Educational sites published anatomy models in VRML, NASA shared Mars Pathfinder models, major museums built virtual tours. By the early 2000s it became clear VRML97 didn't scale — text-based parsing was slow, plugin installation scared off users, and XML began dominating data interchange. The Web3D Consortium (formerly VRML Consortium, renamed in 1998) launched work on X3D — an XML-based VRML successor with modular profiles. X3D 1.0 shipped in 2001, ratified as ISO/IEC 19775-1:2004.

After 2005 VRML effectively dropped out of active use: Cosmo Player was abandoned by SGI, Cortona3D switched to its own proprietary renderer, and plugin-based 3D died with the rise of WebGL (2011) and its descendants Three.js, Babylon.js, glTF. Even so the VRML97 spec remains an official ISO standard, Blender still ships native VRML97 import/export, and millions of .wrl files sit in legacy archives across academic institutions, CAD portfolios, and museum collections.

Inside the file: scene graph, nodes, routes

VRML is a human-readable text format. A file starts with a mandatory header #VRML V2.0 utf8 (for VRML97) or #VRML V1.0 ascii (for VRML 1.0). What follows is a scene graph — a hierarchical tree of nodes, each node a typed object with named fields.

A minimal VRML97 example:

#VRML V2.0 utf8
Transform {
  translation 0 0 0
  children [
    Shape {
      appearance Appearance {
        material Material {
          diffuseColor 0.8 0.4 0.2
        }
      }
      geometry IndexedFaceSet {
        coord Coordinate {
          point [
            0 0 0,  10 0 0,  10 0 10,  0 0 10,
            0 30 0, 10 30 0, 10 30 10, 0 30 10
          ]
        }
        coordIndex [
          0 1 2 3 -1,
          4 5 6 7 -1,
          0 1 5 4 -1,
          2 3 7 6 -1,
          0 3 7 4 -1,
          1 2 6 5 -1
        ]
      }
    }
  ]
}

That's a 10×30×10-unit box with a diffuse brown color — a typical extruded OSM building box. Nodes are nested: Transform groups children, Shape pairs (geometry + appearance), IndexedFaceSet describes faces via vertex indices into the Coordinate node. The terminator -1 marks a face boundary; what follows is the next face.

Key VRML97 nodes: - Geometry: Box, Cone, Cylinder, Sphere (primitives); IndexedFaceSet, IndexedLineSet, PointSet (arbitrary meshes); ElevationGrid (terrain); Extrusion (sweep a contour along a curve); Text (3D text). - Appearance: Material (Phong shading with diffuse/specular/emissive), ImageTexture (PNG/JPEG textures), MovieTexture (animation). - Grouping: Group, Transform (with rotation, scale, translation), Switch, LOD (Level Of Detail). - Sensors: TouchSensor (mouse pick), TimeSensor (animation clock), ProximitySensor (camera proximity), VisibilitySensor. - Interpolators: PositionInterpolator, OrientationInterpolator, ColorInterpolator — for animation via ROUTE. - ROUTE: a declarative link from one node's event to another node's input — for example, click → start animation timer → orientation change.

Map generation of Novosibirsk city center

Cosmo Player, Cortona3D, and the end of the plugin era

In 1996–2002 VRML ran in the browser through a native plugin — Netscape NPAPI or Internet Explorer ActiveX. There were three main players:

Cosmo Player (Silicon Graphics, 1996) — the most popular VRML plugin. OpenGL-backed, hardware-accelerated, full VRML97. SGI shipped it free as part of an "3D web everywhere" strategy. After SGI's bankruptcy in 2009 Cosmo Player was abandoned; it won't run on modern Windows.

Cortona3D (ParallelGraphics, 1999) — the commercial competitor. Used by corporate clients for 3D parts-catalog applications. ParallelGraphics is still alive, but switched to its proprietary Cortona3D Solo and no longer supports VRML97 in modern browsers.

Blaxxun Contact (Blaxxun Interactive, 1996) — a German player focused on multi-user VRML worlds (avatar chat in 3D). By 2005 the company was gone.

The end of the plugin era arrived in 2010: Apple iOS never supported plugins, Chrome killed NPAPI in 2015, Firefox followed in 2017. Every web-3D plugin, including all VRML players, stopped working in modern browsers. WebGL (2011, native 3D graphics without plugins) and then glTF (2015/2017) as the delivery format took over. That was VRML's final demise as a live web format, but not as an ISO standard — the spec remains valid, and desktop software still works with .wrl files.

VRML vs X3D vs glTF

Three formats cover the same problem space — describe a 3D scene for later rendering — across different eras:

VRML97 (1997) — text-only ASCII scene graph. Easy for humans to read, but parsing is slow and there's no built-in validation. ISO standard. Status: deprecated, but the spec lives on.

X3D (2001) — direct VRML successor. Same scene graph but in XML (+ optional binary, JSON, and the old Classic VRML text encoding). Modular profiles (Interchange, Interactive, Immersive, Full). ISO/IEC 19775. Actively maintained by the Web3D Consortium: X3D 4.0 (2023) integrates with HTML5 via an <x3d> tag and renders without plugins through the X3DOM library. Status: maintained but niche adoption.

glTF 2.0 (2017) — the modern mainstream. JSON + binary buffers + textures, designed around GPU shipping (vertex arrays land ready for WebGL with no CPU work). PBR materials, skinning, morph targets, animations. Supported by every 3D engine: Three.js, Babylon.js, Unity, Unreal, Blender, Maya. No ISO yet, but a Khronos Group standard. Status: dominant.

Pick by scenario: for legacy archive recovery (old .wrl from the 1990s) — VRML97 is mandatory. For academic / scientific 3D viz with ISO compliance — X3D. For web/AR/games/any modern stack — glTF. For 3D printingSTL or OBJ.

Strengths and weaknesses

Strengths. Fully textual — opens in any editor, versions in Git like ordinary code. ISO standard since 1997 — guarantees preservation for long-term archives. Blender 4.x still has native VRML97 import/export — 1990s models open and re-edit cleanly. Simple spec — a VRML97 parser can be written by a student over a weekend. Support for animation, sensors, hyperlinks via Anchor (VRML was originally conceived as 3D-space web navigation). Compact for line-art scenes — architectural models tend to be smaller than the glTF equivalent.

Weaknesses. Deprecated for production — no native support in modern browsers, you need a desktop viewer (view3dscene, FreeWRL) or conversion to glTF. Cosmo Player, Cortona3D, Blaxxun Contact — all extinct. Text parsing is slow for large scenes (millions of vertices = tens of seconds to load). Every vertex sits in a Coordinate node and is indexed in the IndexedFaceSet — for very large meshes that's index overhead. No PBR materials — only Phong shading (a 1970s lighting model), which looks "plasticky" in modern renderers. Animation via interpolators and ROUTE is clunky compared to glTF keyframes.

Use cases

Recovery of old archives. Computer graphics courses from 1995–2005 published examples in .wrl. Museums built virtual tours (Louvre, Smithsonian had VRML sections). If you have .wrl or .wrz files from old projects — Blender will open them and re-export to glTF/OBJ.

Academic visualization legacy. Engineering schools in Germany, Japan, and Russia still use VRML in 3D-graphics courses as a "historical minimum" — the simple text format is convenient pedagogically because students see the scene graph laid out plainly.

Scientific visualization in ParaView. ParaView, Kitware's open-source visualization toolkit, exports scenes to VRML (.wrl). Researchers take screenshots and embed them in papers. For ParaView ↔ MATLAB / Mathematica interchange VRML is still occasionally used.

Architectural visual archive. Some early-2000s architecture competitions required VRML submissions for walkthrough models. To open portfolios from that period — the VRML-through-Blender pipeline works.

Old CAD interchange. AutoCAD R14–2004 and MicroStation v8 supported VRML export for web publishing of 3D part models. For recovering models from that era — VRML is readable in modern Blender and FreeCAD.

Software for VRML

Blender. Free, cross-platform. Native VRML97 import/export through File → Import / Export → VRML2 (X3D Extensible 3D)... Supports IndexedFaceSet geometry, transforms, basic materials. Textures import if .png/.jpg files sit next to the .wrl. Doesn't support sensors/scripts — geometry only.

view3dscene. Free, open-source viewer from the Castle Game Engine project (Michalis Kamburelis). The best modern VRML/X3D viewer: supports VRML 1.0, VRML97, every X3D version, sensors, animations, hyperlinks. Runs on Windows, macOS, Linux. Download at castle-engine.io.

FreeWRL. Free, open-source VRML/X3D rendering engine. Implemented as a browser plugin (extinct), a standalone viewer, and Python bindings. More of a developer resource than an end-user tool.

MeshLab. Free mesh tool. .wrl import is supported (geometry only — sensors are ignored). Handy for converting VRML → OBJ / STL / PLY for further processing.

ParaView. Free scientific visualization tool. Exports .wrl via File → Export Scene → choose VRML. Limited import.

Cortona3D Solo. Paid proprietary 3D viewer from ParallelGraphics. A modern continuation of the VRML player, but internally not standard VRML97 — Cortona3D Solo uses its own proprietary stream.

GLC Player. Free multi-format 3D viewer (Windows/Linux). Imports VRML97.

Pipeline in OSM2CDR

Our vrml_exporter.py inherits from Building3DExporter (just like stl_exporter.py, obj_exporter.py, gltf_exporter.py). The pipeline:

  1. Layer loading. PostGIS returns buildings as WKB via ST_AsBinary, skipping GeoJSON parsing — that's a 10–50x speedup for large bboxes.
  2. Calculate building height. Rules: height tag → priority 1, building:levels × 3.0 m → priority 2, type-based fallback (apartments → 15 m, house → 5 m, skyscraper → 100 m, default 6 m).
  3. Extrusion. Each OSM polygon becomes a prism: bottom face (z=0), top face (z=height), and side quads — each quad splits into 2 triangles for the IndexedFaceSet.
  4. Build scene graph. A root Transform, inside it one Shape per building (or one shared Shape with per-face material in group mode); each Shape carries an AppearanceMaterial with diffuseColor by building type and an IndexedFaceSet with Coordinate + coordIndex.
  5. Optional Background node. With with_skybox=true, a Background node adds a pastel sky (skyColor + groundColor gradient).
  6. Optional NavigationInfo. WALK or EXAMINE type in NavigationInfo controls the default mode in view3dscene.
  7. Write ASCII. A text stream with the mandatory #VRML V2.0 utf8 header, hierarchically indented for readability. Optionally gzip-pack to .wrz for ~5–10x smaller files.

Coordinates in VRML are meters, Y-up by convention (VRML97 uses Y as vertical, unlike STL/glTF which are Z-up). Our exporter sets the origin at the bottom-south-west bbox corner after a Web Mercator reprojection with offset. That means the model "stands" on the floor in view3dscene.

Colors in Material.diffuseColor are assigned by building type: residential — beige (0.85 0.78 0.65), commercial — light grey (0.65 0.65 0.70), industrial — dark grey (0.45 0.45 0.50), default — warm tan (0.75 0.65 0.50). Phong shading per spec requires 0..1 RGB values.

Map generation of Ekaterinburg city center

FAQ

Can I open a .wrl in a modern browser? Not natively. Every VRML plugin (Cosmo Player, Cortona3D, Blaxxun Contact) is extinct, and modern browsers don't support NPAPI/ActiveX. Workarounds: install the desktop viewer view3dscene; convert VRML → glTF via Blender import + glTF export; or use X3DOM for X3D (but not VRML97 natively).

What's the difference between VRML 1.0 and VRML97? VRML 1.0 (1994) is a static format based on the SGI Open Inventor syntax. Geometry only, no interactivity. VRML 2.0 / VRML97 (1996/1997) was completely rewritten under SGI's "Moving Worlds" inspiration: added Sensor nodes, Script nodes, ROUTE, animations. The files are incompatible: VRML 1.0 header is #VRML V1.0 ascii, VRML97's is #VRML V2.0 utf8. Modern Blender reads both.

.wrl or .wrz — which to pick? .wrl is plain ASCII; .wrz is the same file packed with gzip (typically .wrl.gz renamed .wrz). .wrz is usually 5–10x smaller. Every modern VRML viewer detects .wrz automatically via gzip magic bytes. For web hosting .wrz saves bandwidth; for editing in a text editor — .wrl.

VRML or X3D for a new project? For new projects — pick X3D (or glTF for web). VRML97 has been deprecated since 2001 with no active development. X3D is the direct successor with XML syntax, ISO/IEC 19775, supported in-browser by X3DOM without plugins. VRML only makes sense for compatibility with old pipelines or for academic / preservation tasks.

Does VRML support textures? Yes, through an ImageTexture node inside Appearance. JPEG, PNG, GIF are supported. Textures are stored as separate files alongside the .wrl. Modern renderers (view3dscene, Blender) handle them correctly. Our exporter doesn't use textures by default (just diffuseColor per building type), but the option texture_buildings=true adds an ImageTexture with a per-building cubemap on request.

Sources

← All articles