STEP→STL Your file stays in this tab · nothing is uploaded

Why does my STL come out lying down or in the wrong place?

The mesh you download sits in the same coordinate frame as the solid it came from. That sentence is easy to say and easy to check, so this page spends its length checking it: the binary record has no field for a transform, the bounding box survives every quality setting, a model scaled 100× keeps an identical mesh, and an inch file becomes a millimetre file without turning. Every number below is measured by this project’s test suite, and none of it is a promise about what your CAD package should do.

The short answer

This converter does not rotate, align, centre or rescale your part, and the origin it writes is the origin the STEP file already had. A 200 × 150 × 84 mm assembly comes back as 200 × 150 × 84 mm at Draft, Normal and Fine, while the triangle count moves from 4,900 to 7,372 to 21,116. Coordinates are carried through, not re-framed.

So a model that looks like it is lying on its side was already lying on its side in the STEP file. “Up” is not stored in an STL and is not chosen by this converter: it is a convention applied later by a slicer, a printer or a person. If the part is correct in CAD but wrong after conversion, the conversion is not the stage that changed it — and the rest of this page shows the measurements behind that claim rather than asking you to take it on trust.

What a triangle record can hold

A binary STL has one fixed header of 84 bytes — 80 bytes of free text and a 4-byte count of triangles — and then 50 bytes per triangle. Each of those 50 bytes is accounted for: a 12-byte normal, three vertices of 36 bytes in total, and a 2-byte attribute that writers use for colour or leave at zero. That is the whole format. There is no matrix, no separate origin, no scale factor, no part name and no unit field.

This is why the byte count is predictable. A flat 10 mm cube is 12 triangles and lands as exactly 684 bytes, which is 84 + 50 × 12. The same identity holds for every file this project tests, at every quality setting, and npm test recomputes it for each one. The formula is not a rule of thumb about STL files; it is the layout of the record, read back as arithmetic.

A binary STL record: an 84-byte header, then 50 bytes per triangle and nothing else Two rows. The first is a single block of 84 bytes, drawn as 80 bytes of header text plus a 4-byte triangle count. The second is one 50-byte triangle record split into a 12-byte normal, 36 bytes for three vertices and a 2-byte attribute. Below is the arithmetic 84 plus 50 times n, and a note that no matrix, origin or unit field exists in either row. The whole file, drawn to its byte layout One shared scale: 6 pixels per byte. This is a 12-triangle cube, so 84 + 50 × 12 = 684 bytes. Header — 84 bytes, once 80 bytes of header text count Triangle — 50 bytes, repeated n times normal 12 B three vertices, 36 B attribute 2 B 84 + 50 × n 12 triangles → 684 bytes, measured No matrix. No separate origin. No scale. No unit. A writer can change orientation only by rewriting the vertex numbers.
The record has nowhere to put a transform. The 84-byte header carries a count, and each 50-byte triangle carries a normal, three vertices and an attribute. Everything about where the part sits is inside those vertex numbers, so “the converter stood it up” would have to mean “the converter rewrote every coordinate”. This one writes the coordinates it read.

The measured box

The claim is checkable at the other end of the pipeline, on the bounding box that the converter reports. Three real files, measured with the engine this site ships:

Bounding boxes reported by the engine. The test suite re-converts each file and fails if a printed number drifts.
Test fileBounding boxWhat it proves
cube-10x10.stp10 × 10 × 10 mmA 10 mm cube stays a 10 mm cube in all three axes; no centring, no normalising.
as1-oc-214.stp (18 parts)200 × 150 × 84 mmAn assembly keeps its own origin and its own three extents.
as1_pe_203.stp (18 parts)5080 × 2209.8 × 3810 mmA second assembly, a different frame, carried through as written.

The first row is the control. If the converter quietly centred everything, a box that started at the origin would move and the 10 mm cube would report a different set of three numbers. It reports 10 × 10 × 10 mm at Draft, Normal and Fine, and the file is 12 triangles / 684 bytes at all three settings. There is no stage in the pipeline where a coordinate could be swapped without changing one of those figures.

Three settings, one box

The quality setting is the only control this converter offers, and it does not touch the frame. On the 18-part AP214 assembly the triangle count roughly quadruples from Draft to Fine while the box stays put:

The same file at all three settings. Triangle counts move; the bounding box does not.
SettingTrianglesBounding box
Draft4,900200 × 150 × 84 mm
Normal7,372200 × 150 × 84 mm
Fine21,116200 × 150 × 84 mm

That difference matters when you are diagnosing a model. A coarser mesh changes how round a curve looks, and it changes the file size by the 84 + 50 × n rule, but it cannot change which way the part faces. If a viewer shows the same part in two different orientations at two quality settings, the orientation is being chosen by the viewer, not by the conversion.

Three quality settings draw the same bounding box while the triangle count grows Three columns for Draft, Normal and Fine. Above, an identical outlined box labelled 200 by 150 by 84 millimetres in all three columns. Below, a bar for the triangle count on one shared scale, 4,900 in Draft, 7,372 in Normal and 21,116 in Fine. One box, three meshes Same 18-part assembly at each setting. The outlined box is drawn once per column; the bars are on one shared scale, 160 px for 21,116 triangles. 200 × 150 × 84 mm 200 × 150 × 84 mm 200 × 150 × 84 mm Draft Normal Fine 4,900 7,372 21,116 The box is identical in all three columns. Bar length is triangle count on one shared scale: 4,900 / 7,372 / 21,116 triangles, measured from as1-oc-214.stp by the test suite.
The quality setting moves the triangle count by roughly four times from Draft to Fine and leaves the bounding box untouched. Measured by npm test on as1-oc-214.stp.

A hundred times the size

The strongest test of “nothing is normalised” is to scale a model and watch the box. One curved solid was converted at its own size and again at 100× that size, at the same setting. The bounding box went from 27.033 mm to 2,703.298 mm on the long axis — a clean 100× on all three axes — and the mesh did not change at all: 516 triangles at Normal in both cases, and identical counts at Draft (286) and Fine (2,142) as well.

A converter that centred each part, or normalised it into a unit box, could not produce that result. The 100× part would come back the same size as the 1× part, or its centre would drift to a fixed point. Neither happens. The engine measures the box, reports it, and writes the coordinates it was given. The workflow page’s scaling experiment owns the mesh-quality question behind the same two numbers; this page uses them only as a position test.

The same curved solid at 1× and 100× its size keeps an identical triangle count while the bounding box grows 100× Two labelled rows. The upper row is the curved solid at its original size, with a 27.033 millimetre long axis and 516 triangles at Normal. The lower row is the same solid scaled 100 times, with a 2,703.298 millimetre long axis and the same 516 triangles. An arrow between the two is labelled exactly 100 times on all three axes, same mesh. A hundred times the size, the same 516 triangles Bounding-box long axis, measured at Normal. Bar length is on one shared scale. 1× — 27.033 mm 516 triangles 100× — 2,703.298 mm 516 triangles — 100× on all three axes, not one triangle added. 2,703.298 ÷ 27.033 = 100.
Position scales; the mesh does not. The long axis grows from 27.033 mm to 2,703.298 mm, exactly 100×, while the count stays at 516 at Normal. A normalising or centring step would break the ratio or move the box off its own origin. Both rows are measured by npm test on every release.

Inches, millimetres, same axes

The unit path is the other place a coordinate could plausibly be rewritten, so it gets the same treatment. This project ships two cube files that are geometrically identical: one declares UNIT('INCH') and writes its coordinates as multiples of 39.370078740157 (which is exactly 1,000 ÷ 25.4), and its twin declares millimetres directly. Both measure a 1,000 × 1,000 × 1,000 mm bounding box. The declaration inside the file is honoured, and the numbers change by the conversion factor — the three axes stay on the same three axes.

That is the difference between a size error and an orientation error. A clean factor of 25.4 on every axis is a unit mismatch: the units page owns that diagnosis. A part that is the right size but faces the wrong way is not a unit problem at all, and no amount of converting will fix it, because the orientation was decided before the file reached the converter.

Where the orientation came from

A STEP file contains a coordinate system, and the geometry in it is written relative to that system. Whoever exported the file decided where the origin sat and which axis pointed up. The converter reads those solids and tessellates them; it does not know what the part is, which face is supposed to touch the bed, or which direction a printer calls vertical. So it carries the frame through.

That is not a limitation to apologise for. A converter that guessed an up direction from geometry would sometimes be wrong, and it would change a file that was correct. The honest arrangement is the one here: the file keeps the frame its author gave it, and the tool that knows the intent — a slicer, a CAD package, the person holding the part — applies the rotation. The workflow page states the same behaviour in one line beside its unit rules; this page is the measurement behind that line.

What to do about it

Rotate or move the part where the decision belongs. In a slicer, use its place-on-bed control. In CAD, re-export the STEP file with the frame you want. Both are one step and neither changes the mesh.

Two checks separate a real conversion fault from a convention mismatch. First, convert the same file and compare the reported 200 × 150 × 84 mm box with what your CAD package reports; if the three numbers match, the geometry is where it was. Second, look at the triangle count: 12 / 684 bytes for a flat cube, 286 / 516 / 2,142 for the cone at three settings. A count that matches the verification page means the mesh is intact, and what remains is orientation — a rotation to apply, not a conversion to repeat.

Questions this page answers

Does this converter rotate or centre my model?

No. A 200 × 150 × 84 mm assembly comes back as 200 × 150 × 84 mm at Draft, Normal and Fine, while the triangle count moves from 4,900 to 7,372 to 21,116. The coordinates are written through, not re-framed.

Why does my STL lie down after a STEP conversion?

Because the frame in the STEP file is the frame you get. This site does not choose which way is up: the orientation was set by whoever wrote the STEP file, and the STL copies those coordinates. A model that lies down was laid down in the source file.

Can a binary STL store a transform or an origin?

No. A binary STL is an 84-byte header plus 50 bytes per triangle; each triangle carries a 12-byte normal, three vertices of 36 bytes and a 2-byte attribute, and nothing else. There is no matrix, no separate origin and no unit field, so a converter cannot record an orientation change anywhere except by rewriting the vertices.

How do I fix a model that is in the wrong place?

Rotate or move it in the slicer or the CAD package, or export the STEP file in the frame you want. This converter will not do it for you, and that is deliberate: guessing which way is up from geometry alone would change a file that was correct.

Where these numbers come from

npm test

The command above re-runs every number this project measured. The workflow owns the six steps and the quality presets, the units page owns the 25.4× diagnosis, and the converter is where a STEP file meets the kernel, in the tab.