<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Jeremy Xiao — 3D file notes]]></title><description><![CDATA[Jeremy Xiao — 3D file notes]]></description><link>https://jeremyxiao3d.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sun, 01 Nov 2026 06:34:00 GMT</lastBuildDate><atom:link href="https://jeremyxiao3d.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[GLB to STL: Turn a Web 3D Model into a Printable Mesh at the Right Size]]></title><description><![CDATA[Set the unit first: why a GLB to STL conversion comes out tiny or huge, and how to check the size before slicing.]]></description><link>https://jeremyxiao3d.hashnode.dev/glb-to-stl-turn-a-web-3d-model-into-a-printable-mesh-at-the-right-size</link><guid isPermaLink="true">https://jeremyxiao3d.hashnode.dev/glb-to-stl-turn-a-web-3d-model-into-a-printable-mesh-at-the-right-size</guid><category><![CDATA[3D printing]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[3d modeling]]></category><dc:creator><![CDATA[Jeremy Xiao]]></dc:creator><pubDate>Fri, 30 Oct 2026 04:26:14 GMT</pubDate><content:encoded><![CDATA[<p>GLB files are built for real-time viewers and games: one binary package with meshes, materials, textures, a node hierarchy and sometimes animation. A slicer wants something much simpler, a static triangle surface. This walkthrough converts a GLB to STL in the browser and covers what usually goes wrong: <strong>scale</strong>. glTF measures distance in metres, while most slicers read STL numbers as millimetres.</p>
<p>My sample is <code>pen-cup.glb</code>, a small test model I made for this post. It is a pen cup authored in <strong>metres</strong>, 0.08 × 0.09 × 0.08 m, Y-up as glTF expects. It has two meshes (a hollow wall and a base disc) under a parent node that moves them away from the origin, and one terracotta-coloured material.</p>
<h2>What a GLB to STL conversion keeps and drops</h2>
<ul>
<li><strong>Geometry stays.</strong> The visible mesh surfaces are written as triangles.</li>
<li><strong>Everything else is dropped.</strong> STL has no materials, textures, vertex colours, animation or hierarchy. The terracotta colour will not survive.</li>
<li><strong>Placement can be baked in.</strong> With <em>Apply transforms</em> on, node position and scale go into the coordinates.</li>
<li><strong>Separate meshes become shells.</strong> The wall and base end up in one STL as separate shells.</li>
<li><strong>No repair.</strong> Open surfaces stay open; the converter doesn't add wall thickness or close gaps.</li>
</ul>
<h2>Step 1: Open the converter and set the options first</h2>
<p>Go to the <a href="https://3dconverter.org/convert/glb-to-stl">GLB to STL converter on 3dconverter.org</a>. The page shows a drop zone, a summary of what is kept in the STL and what is left out, and a settings panel. The file is processed in your browser; the page says there is no model upload.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/477d4709-55c3-4544-aa4d-4bd42efe9558.png" alt="GLB to STL converter page on 3dconverter.org before a file is chosen" style="display:block;margin:0 auto" />

<p><em>The converter before a file is chosen: drop zone, "Kept in the STL / Left out" summary and the settings panel.</em></p>
<p>One thing to know before you start: <strong>the converter runs as soon as you choose a file</strong>, and there is no separate Convert button. The settings can only be changed before a file is loaded, so set them now:</p>
<ul>
<li><strong>Unit:</strong> auto, mm, cm, m or inch. Set it explicitly; millimetres are the usual choice for slicers.</li>
<li><strong>Up axis:</strong> auto, y-up or z-up. glTF is Y-up.</li>
<li><strong>Apply transforms:</strong> bakes node placement and scale into the coordinates. Keep it on so the parts stay where the scene put them.</li>
<li><strong>Recalculate normals:</strong> recomputes face normals. I left it off.</li>
<li><strong>STL encoding:</strong> binary or ascii. Binary is smaller and is what most slicers expect.</li>
</ul>
<p>For the pen cup I chose <strong>mm</strong>, left the up axis on auto, kept <em>Apply transforms</em> on, left <em>Recalculate normals</em> off and picked <strong>binary</strong>. Until a file is chosen, the button at the bottom of the panel just reads "Choose a file first".</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/0888476b-e5bb-4fb0-94a5-737e79028c0a.png" alt="Converter settings panel with unit set to millimetres and binary STL encoding" style="display:block;margin:0 auto" />

<p><em>Settings before loading: Unit = mm, up axis auto, Apply transforms on, Recalculate normals off, binary encoding.</em></p>
<h2>Step 2: Choose the GLB</h2>
<p>Click <strong>Choose a GLB file</strong> or drop the file onto the page. The page accepts single-file binary glTF (.glb), up to 20 files at once, and it offers a sample ("Glazed mug GLB") if you don't have a model handy.</p>
<p>Conversion starts immediately. A moment later the page shows "Converted", a split preview of the source and the output, and a <strong>Download STL</strong> button.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/588af6b7-284e-4099-b06b-1689efd323b1.png" alt="pen-cup.glb converted to STL with preview, measurements table and Download STL button" style="display:block;margin:0 auto" />

<p><em>After conversion: split preview of the GLB source and the STL output, with the Download STL button and the size table.</em></p>
<p>The table next to the preview compares the source (in m) with the STL (in mm). For the sample it reads:</p>
<ul>
<li><strong>X × Y × Z:</strong> 0.08 × 0.09 × 0.08 m in the source, <strong>80 × 90 × 80 mm</strong> in the STL.</li>
<li><strong>Triangles:</strong> 768 in, 768 out.</li>
<li><strong>Materials:</strong> 1 in the source, 0 in the STL.</li>
</ul>
<p>That is the same physical cup: converting metres to millimetres multiplies every coordinate by 1,000 but keeps the real size.</p>
<h2>Step 3: Read the full quality report</h2>
<p>Below the preview, expand <strong>Full quality report</strong>. It reopens the STL and checks it against the source, one card per feature.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/08229434-c15c-4360-869e-60a3a633ae09.png" alt="Full quality report for the GLB to STL conversion with geometry, materials, hierarchy, units and axis checks" style="display:block;margin:0 auto" />

<p><em>The expanded quality report: geometry kept, warnings for materials and hierarchy, units changed from m to mm, axis kept as Y-up.</em></p>
<p>For the pen cup:</p>
<ul>
<li><strong>Geometry</strong> is preserved (768 → 768 triangles).</li>
<li><strong>Materials</strong> and <strong>Hierarchy</strong> are flagged, because STL can't keep them.</li>
<li><strong>Units</strong> changed from m to mm.</li>
<li><strong>Axis</strong> was kept as Y-up.</li>
<li>The report also notes that the output was parsed again successfully.</li>
</ul>
<p>A good readback only means the STL could be parsed and matched the source. It doesn't prove the model is watertight, has printable wall thickness or fits your build plate.</p>
<h2>Step 4: Download and check it before slicing</h2>
<p>Click <strong>Download STL</strong> and keep the original GLB next to it. The GLB remains your source for colour, materials and scene structure; an STL can't give them back.</p>
<p>Then open the STL in a viewer or your slicer:</p>
<ol>
<li><strong>Measure a known dimension.</strong> The cup should be 80 mm wide. If it shows as 0.08 mm or 80 m, the unit was misread.</li>
<li><strong>Check the orientation.</strong> The cup should stand upright. If it lies on its side, re-run with the other up-axis option rather than rotating by eye.</li>
<li><strong>Count the shells.</strong> The wall and base are separate shells here. Many slicers handle this, but a repair tool may want them merged.</li>
<li><strong>Run the slicer's checks.</strong> Look at manifold state, wall thickness and supports with the printer and material you will actually use.</li>
</ol>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/9fee3d38-4574-450d-b836-cc51e9e5b4de.png" alt="Pen cup GLB preview next to the converted STL rendered upright in a 3D viewer" style="display:block;margin:0 auto" />

<p><em>Left: the converter's split preview of source and output. Right: the downloaded STL in a viewer, upright, 768 triangles.</em></p>
<h2>Common questions</h2>
<p><strong>Why is my converted STL tiny or huge?</strong> glTF uses metres. If the unit is left to a guess and the slicer reads millimetres, a 0.08 m cup becomes 0.08 mm. Choose the unit before loading the file and check the reported size.</p>
<p><strong>I loaded the file and forgot to set the unit. Now what?</strong> Settings can only be changed before a file is loaded, so set the unit first, then choose the file. If you missed it, use the Change file button to start again.</p>
<p><strong>Will the STL keep my textures?</strong> No. If appearance matters, keep the GLB, or convert to a format that can carry more of the source, such as OBJ.</p>
<p><strong>Does conversion make a model printable?</strong> No. Thin parts and open surfaces can look perfect in a web viewer and still fail as a solid. Treat the STL as the start of print preparation.</p>
<p><strong>Recap:</strong> set unit, up axis and encoding → choose the GLB (it converts automatically) → read the size and quality report → download → measure and check in your slicer.</p>
<p><em>Disclosure: I make 3D Converter, the browser tool used in this walkthrough.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Convert GLB to OBJ (and Keep the MTL + Textures)]]></title><description><![CDATA[GLB is a great delivery format: one binary file that can hold a whole glTF scene with meshes, PBR materials, textures, node hierarchy and animation. But…]]></description><link>https://jeremyxiao3d.hashnode.dev/how-to-convert-glb-to-obj-and-keep-the-mtl-textures</link><guid isPermaLink="true">https://jeremyxiao3d.hashnode.dev/how-to-convert-glb-to-obj-and-keep-the-mtl-textures</guid><category><![CDATA[3d]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[gltf]]></category><category><![CDATA[webdev]]></category><dc:creator><![CDATA[Jeremy Xiao]]></dc:creator><pubDate>Wed, 28 Oct 2026 02:51:27 GMT</pubDate><content:encoded><![CDATA[<p>GLB is a great delivery format: one binary file that can hold a whole glTF scene with meshes, PBR materials, textures, node hierarchy and animation. But plenty of tools and pipelines still expect a Wavefront OBJ — for quick mesh edits, inspection, scripting, or an older OBJ-based workflow. This walkthrough shows how to turn a GLB into an OBJ with its MTL file and base color textures, right in the browser, and what to check before you use the result.</p>
<p>I'm using a small sample model: a 0.5 m textured wooden crate (<code>wooden-crate.glb</code>, one material with a base color texture).</p>
<h2>What survives the trip (and what doesn't)</h2>
<p>OBJ is a much simpler format than GLB, so it helps to know the limits up front:</p>
<ul>
<li><strong>Kept:</strong> geometry. Materials, textures, units, axis convention and multiple objects are kept <em>partially</em>: each material keeps its base color, opacity and base color texture, written to an MTL file.</li>
<li><strong>Left out:</strong> vertex colors, animation, skins, scene hierarchy, cameras, lights and metadata. Metalness, roughness, normal and emissive maps have no MTL equivalent.</li>
</ul>
<p>In other words, the OBJ is a static, editable copy of the geometry with simple textured materials. Keep the GLB as your source of truth.</p>
<h2>Step 1 — Open the GLB to OBJ converter</h2>
<p>Open the <a href="https://3dconverter.org/convert/glb-to-obj">GLB to OBJ converter on 3dconverter.org</a>. Free local conversions don't need an account or sign-up.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/264d50dd-98f2-4eb5-bf74-23926fab402b.png" alt="The GLB to OBJ converter page before a file is selected" style="display:block;margin:0 auto" />

<p><em>The converter page: drop zone on the left, output panel on the right, and the "Kept / Left out" summary for this route.</em></p>
<h2>Step 2 — Add your GLB file</h2>
<p>Click <strong>Choose a GLB file</strong> or drag the <code>.glb</code> onto the drop zone. The page processes the file in a Web Worker in your browser tab — the model is not uploaded to a conversion server. You get an interactive preview (drag to rotate) and a compatibility report for the GLB → OBJ route.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/d9a25931-651c-4e3e-980d-f4802c782d7b.png" alt="wooden-crate.glb loaded in the converter with a rotatable 3D preview" style="display:block;margin:0 auto" />

<p><em>The sample crate loaded locally, with a rotatable preview and the converter's output panel. The "Kept / Left out" summary above shows what OBJ can and cannot carry.</em></p>
<p>Note that the page only reads the file you select; it does not fetch anything a model references from a web address.</p>
<h2>Step 3 — Choose units, up axis and transforms</h2>
<p>Open <strong>Settings</strong> before converting. glTF uses meters and Y-up, while OBJ applications vary, so this route lets you make both explicit:</p>
<ul>
<li><strong>Unit:</strong> auto, mm, cm, m or inch. Converting meters to millimeters scales coordinates by 1,000.</li>
<li><strong>Up axis:</strong> auto, Y-up or Z-up. Changing it rotates the geometry.</li>
<li><strong>Apply transforms:</strong> bakes node position, rotation and scale into the mesh so the OBJ matches the visible static pose.</li>
<li><strong>Recalculate normals:</strong> optional.</li>
</ul>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/9433e11b-3a9c-49e8-8cd6-8f4a75cdda00.png" alt="The Settings panel with unit, up-axis, apply-transforms and normals options" style="display:block;margin:0 auto" />

<p><em>Pick the destination unit and up axis first. Write both choices down with the asset.</em></p>
<p>If your GLB is animated, pause on the pose you actually want first. The converter exports static geometry and does not keep a rig or animation clips.</p>
<h2>Step 4 — Convert and read the validation report</h2>
<p>Run the conversion. When it finishes, the browser reopens the new OBJ with the matching loader and compares it with your GLB: dimensions, object count, triangle count, materials and textures. Rows the OBJ cannot represent — hierarchy and animation — show a warning instead of a match.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/849a2b9e-80df-4eec-b315-9544189063a2.png" alt="Before-and-after report showing triangles, size and unit for the converted OBJ" style="display:block;margin:0 auto" />

<p><em>Triangles, size (X × Y × Z) and unit, before and after. For the crate, the 12 triangles and the 0.5 m size should match.</em></p>
<p>Be clear about what this check proves: it catches empty or unreadable output. It does <strong>not</strong> repair a mesh, certify printability, or make the two formats lossless.</p>
<h2>Step 5 — Download the OBJ package</h2>
<p>When the GLB has materials, the download is a ZIP containing the <code>.obj</code>, the <code>.mtl</code> and the original base color images, copied unchanged. Texture coordinates are flipped to the OBJ convention for you.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/f43543f6-4e45-46e1-9055-777e898cd29d.png" alt="The downloaded ZIP extracted into a folder with the OBJ, MTL and texture image" style="display:block;margin:0 auto" />

<p><em>Keep the OBJ, MTL and image files together in one folder — the OBJ references the MTL, and the MTL references the texture.</em></p>
<h2>Step 6 — Check the result in your target app</h2>
<p>Open the OBJ in the editor you plan to use and run four quick checks:</p>
<ol>
<li><strong>Pose:</strong> it's the static pose you wanted (animation can't come back later).</li>
<li><strong>Scale and orientation:</strong> compare the dimensions and up axis with the settings you chose, instead of trusting import defaults.</li>
<li><strong>Parts:</strong> object and triangle counts look right, even though the original scene tree is gone.</li>
<li><strong>Materials:</strong> base colors and textures appear; expect PBR details (metalness, roughness, normal maps) to be missing.</li>
</ol>
<img src="https://cdn.hashnode.com/uploads/covers/6ae161500e21058196678400/928f4b25-421b-4946-b45e-2dae7b2cd07f.png" alt="Before and after: the GLB crate and the converted OBJ crate side by side" style="display:block;margin:0 auto" />

<p><em>Before (GLB) and after (OBJ): same shape and base texture, with the static pose baked in.</em></p>
<h2>When not to use OBJ</h2>
<p>Don't use OBJ as an archive for a complete GLB scene. If you need the full PBR material set, rigging, animation clips, cameras or lights to stay editable, open the GLB in a glTF-aware authoring tool and export a fuller package there. For simple shape work, a textured preview or a legacy OBJ pipeline, a browser-side GLB → OBJ conversion with a before-and-after report is quick and keeps the model on your machine.</p>
<p><strong>Quick recap:</strong> open the converter → add the GLB → set unit, up axis and transforms → convert and read the report → download the ZIP (OBJ + MTL + textures) → check scale, pose and materials in your editor.</p>
<hr />
<p><em>Disclosure: I make 3D Converter, the browser tool used in this walkthrough.</em></p>
]]></content:encoded></item></channel></rss>