A community effort to compare raw 3D scan results from desktop 3D scanners on shared, standardized objects.
This initiative was started by OpenScan, but the content comes from the community. Instead of relying on hard-to-verify numbers, we scan small, standardized physical objects — challenging on several levels — and put the raw results side by side. It is far from scientific, but gathering data is a first step toward a better overview.
3D Scanner Manufacturers are very welcome to participate to keep the comparison neutral; reach out publicly or via info@openscan.eu.
- provide an unmodified .stl or .ply file and share the link on GitHub or mail to info@openscan.eu
- note, that by sharing the .stl file, you agree, that the file becomes part of this repository with the specified licence (GNU). We also upload the results on printables.com with your specified details and individual comment.
- specify your scanning setup and procedure (scanner name, scanning time, settings ...)
- if you want, add your (company) details, links, etc. if you want to be mentioned as the source
![]() |
![]() |
![]() |
|---|
The original model was created by Valandar and can be downloaded from Thingiverse. We slightly modified this model by adding some text to the base. Get the modified version on Printables.com
We choose this model and fabrication method, as it represents a challenging real world use case for many scanners. The model has features at different scales, so that even high-end scanners should have a challenge ;) The 3d printing process creates tiny artifacts (layer lines, support residue..), which should be visible on better scanning results.
Download the model from Printables.
We provide printed models and offer free worldwide shipping. Just drop us a mail to info@openscan.eu or support the project by ordering your Benchy for 10€ (incl. worldwide shipping) through our website openscan.eu)
Alternatively, use your resin printer with 0.1mm layer height to print the model.
38 scanners, 50 scans
Scanners included:
- OpenScan Benchy CAD Reference
- Hexagon RA83-7 AS1
- Hexagon RA83-7 RS5
- OpenScan Mini (imx519)
- OpenScan Mini (hawkeye)
- Creality CR-Scan Ferret
- Revopoint Pop2
- OpenScan Classic with Daheng 6mpx
- Revopoint Mini
- Revopoint Pop3
- 3DMakerPro Moose
- Revopoint Range
- Creality Otter
- Revopoint Range 2
- iPhone15 Pro Max
- OpenScan Classic + Daheng 21mpx
- Creality Raptor
- Revopoint MetroX
- Einstar VEGA
- Revopoint Miraco Plus
- David SLS + FlexScan
- EinScan SP
- Creality RaptorX
- MatterAndForm THREE
- Creality Sermoon P1
- EinScan H
- HP Pro S3
- Artec Micro II
- Artec Micro
- Artec Space Spider
- Creaform HandySCAN Black Elite
- Artec Leo
- iTero Lumina intraoral
- Zeiss Atos-Q
- HandySCAN EVO Elite
- Keyence VL570
- Hexagon Absolute 85
- CT Scanner
![]() |
![]() |
![]() |
![]() |
|---|
The ScanBench was created by Julien Mairy and can be downloaded from MakerWorld. The ScanBench takes a modular approach to scanner benchmarking: a single FDM-printed baseplate carrying a set of dedicated test zones — spheres, threads, recessed depths, sharp angles, fine textures and organic surfaces — each chosen to stress a different part of the scanning and reconstruction pipeline. Because each challenge sits in its own zone, the ScanBench makes it possible to see where a scanner struggles rather than just whether it does. As an FDM print it covers a larger size range and shows coarser surface artifacts than a small resin object, and printing the same modules in different materials (translucent PETG, silk PLA, matte black) allows reflection, transparency and contrast to be tested on a single platform.
Download the model from MakerWorld. print settings:
- 0.08mm layer height
- 0.4mm nozzle
- material of your choice
9 scanners, 17 scans
Scanners included:
- ScanBench CAD Reference
- OpenScan Classic (imx519)
- Revopoint Pop4
- Revopoint MetroY Pro
- Einstar Rockit
- MatterAndForm THREE
- Creality Sermoon P1
- XX3D SM02
- Einscan Rigil
├── benchmarks/
│ ├── OpenScanBenchy/
│ │ ├── assets/
│ │ │ ├── render/ <-- saves rendered files done by createRender.py
│ │ │ │ ├── ...
│ │ │ ├── stl_raw/ <-- drop new raw scans + sidecar yaml here, only used locally
│ │ │ ├── stl_aligned/ <-- aligned by alignScan.py, only used locally
│ │ │ ├── ... <-- photos, rendered grids
│ │ ├── data.yaml <-- all scanner & scan metadata
│ │ └── README.md <-- detailed README.md for each benchmark (note the static and automated blocks!)
│ └── ScanBench/
│ ├── ... <-- second benchmark like above
├── scripts/
│ ├── blender/ <-- Blender files with the used camera positions
│ │ ├── OpenScanBenchy.blend
│ │ └── ScanBench.blend
│ ├── alignScan.py <-- aligns raw scans to the reference mesh and merges sidecar yaml into data.yaml
│ ├── createRender.py <-- render all stl_aligned files and create grids
│ └── generateReadme.py <-- update all README.md files with new renders/infos from data.yaml
├── LICENSE
└── README.md <-- this file (only contains summary of the individual benchmarks)
The easiest way of adding a new 3D scan to the benchmark is sending the result to info@openscan.eu. Try to provide as much info about the scanning process as possible to make the result more comparable (scan time, preparation, scan mode...)
Each benchmark object is one folder under benchmarks/, fully described by its data.yaml.
- Add a new benchmark object: create a new folder under
benchmarks/with its owndata.yaml,assets/, and agrids:entry indata.yaml. The script picks it up automatically and lists it in the index above.
- Drop the raw scan stl and a *sidecar yaml into
assets/stl_raw/(see template and naming convention below) - Run
python scripts/alignScan.py. It aligns the scan against the benchmark's reference mesh, writes the result toassets/stl_aligned/, and merges the sidecar info intodata.yaml. - Run
python scripts/createRender.pyto render it and build the comparison grids. - Run
python scripts/generateReadme.pywill update all the dynamic sections using the rendered images and data.yaml entries. - the
README.mdfiles have a labeled static section, which can be manually edited (though the automatic process will be sufficient, when you just want to add a new scan to an existing benchmark)
Each raw stl in assets/stl_raw/ needs a matching sidecar yaml describing that one scan. Naming convention: same filename stem, .yaml extension — alignScan.py matches them up by stem, and the stem also becomes the aligned filename recorded in data.yaml.
assets/stl_raw/
├── scannerName_scanMode_user.stl
└── scannerName_scanMode_user.yaml
Template for the sidecar yaml:
scanner: '' # name of the device — must match exactly to group with other scans of the same scanner
price: '' # optional retail price, only read if this is the first scan for this scanner
rec_object_size: '' # optional manufacturer data, only read if this is the first scan for this scanner
accuracy: '' # optional manufacturer data, only read if this is the first scan for this scanner
resolution: '' # optional manufacturer data, only read if this is the first scan for this scanner
link: '' # optional link to manufacturer site, only read if this is the first scan for this scanner
by: '' # your username
by_url: '' # optional link to your website/profile
url: '' # link to the 3d model (sketchfab, printables ...)
scanmode: '' # optional, e.g. laser/IR mode
notes: '' # optional but useful info :)







