3DM
Generated by scripts/gen-format-pages.py from docs/data/format-metadata/, FILE_FORMATS.csv and docs/formats-master.csv. Do not edit by hand: change the source, then run the script.
Rhino 3DM.
At a glance
| Original creator | Robert McNeel & Associates, the publisher of Rhino |
| Purpose | Exchange of mathematical 3D geometry (NURBS curves and surfaces, and analytic surfaces) between Rhino and other software. |
| Extensions | .3dm |
| Poka parser | poka-3dm |
| Viewer | poka-3d-viewer |
| Depth tier | Parser with a shared viewer (see Depth tiers) |
| Breadth tier | B3 Core (see Breadth tiers) |
Preview a sample
These are sample files, not yours. Poka opens a sample in your browser: the file is read and parsed on your device and nothing is uploaded.
How much Poka reads
B3 Core. Only the main content type or types are decoded (for example geometry but not materials, layers or annotations, or only one version family). The list of gaps is substantial.
Confidence: medium (the reviewer read the code). Basis: Reviewed 2026-10-16: poka-3dm (main.rs parse_3dm_scene and build_scene, brep.rs, Poka's own trimmed-face tessellator) over the cadmpeg-codec-rhino 0.5.5 decoder (read from the cargo registry); 16 unit and corpus tests pass (the crate has no tests directory; corpus tests live in main.rs) and a native probe census ran over the 33 corpus .3dm files. Wasm builds and viewer rendering were not run. Covers archive versions 50, 70 and 80 (the only ones in the corpus: 11, 17 and 5 files); the codec README says 2, 3, 4, 50, 60, 70, 80 and 90 open, which is untested in Poka. High confidence for geometry, medium for versions. Borderline B2 on geometry alone.
What Poka does not read
- SubD objects are counted as not drawn but never drawn
- Annotations: dimensions, text, leaders and hatches (some dimension records also fail to decode: PAX.3dm, stozek_001.3dm, sniezynka_001.3dm)
- Colours, materials and textures (every mesh has colour 0)
- Layer names and structure, object names, units, named views and lights
- Undecoded object records on some files (bombka_002.3dm decodes 167 of 369, PAX.3dm 7 of 17, stozek_001.3dm 11 of 17)
- Curves with no extent are skipped (MIS_1500x3000.3dm draws 343 of 397)
- Archive versions other than 50, 70 and 80 are untested in Poka
- Block references are expanded by the decoder (code read, not run on a block-heavy file)
- A very large file may exceed the 40 s wasm limit (BRAMA_WEJSCIOWA.3dm took 22.5 s in a native release decode; not tested under wasm)
Background
The format changes with Rhino releases: the Library of Congress record lists versions 1 to 8 and says Rhino can save to any earlier version except 1.x. McNeel funds the openNURBS Initiative, whose toolkit reads and writes the format without Rhino; the rhino3dm libraries wrap it for .NET, Python and JavaScript. Poka has been run on archive versions 50, 70 and 80 only (the versions in the corpus); the decoder lists older and newer ones, which are untested in Poka. No first-publication year was found in a source.
Derived and related formats
- Rhino backup file (
.3dm.bak): Listed by the Library of Congress as related; Poka does not claim it.
Libraries
Libraries Poka uses or has assessed for this format, with the status, licence and language the registry records.
- cadmpeg-codec-rhino (used; Apache-2.0; Rust)
- cadmpeg-ir (used; Apache-2.0; Rust)
- spade (used; MIT OR Apache-2.0; Rust)
- zstd-wasm-shim, in-repo stand-in for zstd over ruzstd (used; Poka code, ruzstd MIT; Rust)
- cadmpeg (candidate; Apache-2.0; Rust; https://github.com/cadmpeg/cadmpeg)
- rhino3dm (candidate; MIT; C++/C#/JS/Python; https://github.com/mcneel/rhino3dm)
- openNURBS (candidate; McNeel permissive licence (LICENSE); C++; https://github.com/mcneel/opennurbs)
Software that uses it
- McNeel Rhinoceros 3D