{"id":10780,"date":"2026-07-17T11:17:18","date_gmt":"2026-07-17T10:17:18","guid":{"rendered":"https:\/\/www.katsbits.com\/codex\/?p=10780"},"modified":"2026-07-17T11:17:18","modified_gmt":"2026-07-17T10:17:18","slug":"roblox-mesh-prep-blender","status":"publish","type":"post","link":"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/","title":{"rendered":"Roblox Deep Dive: Basics of Mesh Preparation in Blender"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a5a9412bbceb\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a5a9412bbceb\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/#description\" >Description<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/#avatar-reference-optional\" >Avatar Reference (optional)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/#apply-transforms-optional\" >Apply Transforms (optional)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/#objectmodel-origin-optional\" >Object\/Model Origin (optional)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/#single-uvimage\" >Single UV\/Image<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/#triangulate\" >Triangulate<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/#mesh-density\" >Mesh Density<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/#export-format\" >Export Format<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/#timestamps\" >Timestamps<\/a><\/li><\/ul><\/nav><\/div>\n<div class=\"tabbed-video-container\">\n<div class=\"tab-buttons\">\n    <button class=\"tab-button active\" data-tab=\"rumble\">Rumble<\/button><br \/>\n    <button class=\"tab-button\" data-tab=\"youtube\">YouTube<\/button><br \/>\n    <button class=\"tab-button\" data-tab=\"other\">Other<\/button>\n  <\/div>\n<div id=\"rumble\" class=\"tab-content active\" style=\"background-color: black; position: relative; padding-bottom: 56.25%; padding-top: 25px; height: 0; overflow: hidden; max-width: 100%;\">\n    <iframe loading=\"lazy\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" src=\"https:\/\/rumble.com\/embed\/v7an62o\/?pub=d3lcu\" width=\"270\" height=\"480\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe>\n  <\/div>\n<div id=\"youtube\" class=\"tab-content\" style=\"background-color: black; position: relative; padding-bottom: 56.25%; padding-top: 25px; height: 0; overflow: hidden; max-width: 100%;\">\n    <iframe loading=\"lazy\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" src=\"https:\/\/www.youtube.com\/embed\/FyKg20QZ21g?rel=0\" width=\"270\" height=\"480\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe>\n  <\/div>\n<div id=\"other\" class=\"tab-content\" style=\"background-color: black; position: relative; padding-bottom: 56.25%; padding-top: 25px; height: 0; overflow: hidden; max-width: 100%;\">\n<!-- TikTok --><br \/>\n<iframe loading=\"lazy\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" src=\"https:\/\/www.tiktok.com\/player\/v1\/7663429136643329302?music_info=0&#038;description=0\" width=\"270\" height=\"480\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p><!-- Twitch --><br \/>\n<!-- iframe style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" src=\"https:\/\/player.twitch.tv\/?channel=katsbits&parent=www.katsbits.com\" width=\"270\" height=\"480\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe -->\n  <\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"description\"><\/span>Description<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Generally speaking it&#8217;s relatively straightforward to export content from Blender for import and use in Roblox, simply make something, centre it on the grid and export to OBJ, FBX of glTF, and let Roblox Studio do all the work on import. For best results, however, good practice should be to perform some basic prep so that, at the very least, the incoming model looks exactly the same in Roblox as it does in Blender.<\/p>\n<p><b>Duration<\/b>: total c. 25 mins (00:25:00).<br \/>\n<b>Info<\/b>: 1080p.<br \/>\n<b>Suitability<\/b>: Beginner+.<br \/>\n<b>Source<\/b>: n\/a.<br \/>\n<b>Product ID<\/b>: n\/a.<\/p>\n<blockquote><p><strong>Design note<\/strong>: some additional information to prep meshes in Blender for export to Roblox Studio;<\/p>\n<div style=\"background-color: #dedede; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Aside<\/strong>: the details discussed in this tutorial specifically relate to the core prep work that&#8217;s necessary, and typically expected, to get a fully functional and optimised model into Roblox Studio. More advanced topics like LOD (Level Of Detail), animation, armatures etc., will be discussed separately.<\/div>\n<h4 style=\"font-weight:normal\"><span class=\"ez-toc-section\" id=\"avatar-reference-optional\"><\/span><strong>Avatar Reference<\/strong> (optional)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Although Blender and Roblox use the same system scaling and units of measurement (metres), for accuracy a Roblox avatar can be used. This can be the <a href=\"https:\/\/create.roblox.com\/docs\/art\/modeling\/project-files#avatar-and-accessories\" target=\"_blank\">Blocky source files<\/a> provided by Roblox, or a <a href=\"https:\/\/www.katsbits.com\/codex\/import-roblox-avatar-blender\/\">custom avatar exported from Roblox Studio<\/a>. In either instance, this provides a scale, size and &#8216;look&#8217; reference items can be built around.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-blocky-avatar.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-blocky-avatar.jpg\" alt=\"Roblox avatar reference\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Blocky source file open in Blender ready to be used as a reference around which the accessory can be made. Alternatively this can be a Studio exported avatar when making something for a specific outfit\/fit.<\/i><\/p>\n<h4 style=\"font-weight:normal\"><span class=\"ez-toc-section\" id=\"apply-transforms-optional\"><\/span><strong>Apply Transforms<\/strong> (optional)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Following on from the above, if an avatar <em>has<\/em> been used to ensure object proportion and position relative to it&#8217;s eventual placement in Roblox, while this data is saved to file on export from Blender, it is ignored and reset by Roblox Studio on import; Studio essentially resets any <strong>Origin<\/strong> and related <strong>Transform<\/strong> properties it might find. To avoid this best practice should be to apply all transform properties (<span class=\"shortcutkey\">Ctrl<\/span> + <span class=\"shortcutkey\">A<\/span>) to objects before export &#8211; <strong><em>Object \u00bb Apply \u00bb [option]<\/em><\/strong> (<em>typically <strong>All Transforms<\/strong> or <strong>Rotation &#038; Scale<\/strong><\/em>).<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-transforms.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-transforms.jpg\" alt=\"Apply Transforms\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Be sure to apply all transforms before export from Blender so Roblox doesn&#8217;t display the mesh with an unexpected orientation.<\/i><\/p>\n<h4 style=\"font-weight:normal\"><span class=\"ez-toc-section\" id=\"objectmodel-origin-optional\"><\/span><strong>Object\/Model Origin<\/strong> (optional)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Similar to Apply Transforms, while an objects <strong>Origin<\/strong> aids positioning the model whilst its being built, upon import into Roblox, Origin data is essentially ignored and virtually reset to use the objects centre-of-mass based on its Bounding Box volume. Depending on the shape and size of the model this can offset the origin awkwardly relative to its native position in  Blender. To mitigate this, once the item has been modelled, recentre the origin to <strong>Center of Mass (volume)<\/strong> in Blender &#8211; <strong><em>Object \u00bb Set Origin \u00bb Origin to Center of Mass (Volume)<\/em><\/strong>.<\/p>\n<div style=\"background-color: #fc0; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Important<\/strong>: Blender does not use the total area or volume occupied by an object, its Bounding Box, as the basis upon which it calculates centre or mass, it&#8217;s not necessarily making a boundary determination. Instead Blender positions the centre of mass properly, based on the objects actual shape. Relative to Roblox this is more expensive and accurate way to offset the Origin. Similarly, if an object is rotated off-axis in Blender, because that&#8217;s how its to be seen or used in Roblox, this will change the dimensions of the Bounding Box used to determine where Roblox resets the Origin to, and as a result may alter the transform behaviour in Studio as the item is manipulated around the scene.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-bounding-box-size.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 100%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-bounding-box-size.jpg\" alt=\"Bounding Box changes\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Differences in the objects orientation will affect the objects Bounding Box in Roblox, and where it subsequently calculates the Origin to be when reset.<\/i><\/div>\n<p><\/p>\n<div style=\"background-color: #dedede; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Aside<\/strong>: to visualise an objects <strong>Bounding Box<\/strong> the way Roblox sees it, in <strong>Object Properties<\/strong> enable <strong>Bounds<\/strong> &#8211; <strong><em>Object Properties \u00bb Viewport Display \u00bb Bounds<\/em><\/strong> &#8211; to display a wireframe around the object based on its volume, the total area occupied. This is essentially what Roblox uses to adjust the origin. Once enabled, if the origin is not positioned relative to absolute centre, the mesh can be manually (physically) offset in <strong>Edit Mode<\/strong> to compensate &#8211; as Roblox resets the origin anyway doing this provides a proxy representation as to what will happen to the mesh on import into Roblox Studio.<\/p>\n<p>Alternatively, drop a Cube into the scene &#8211; <strong><em>Add \u00bb Mesh \u00bb Cube<\/em><\/strong> &#8211; and change its size to match the models <strong>Dimensions<\/strong> on the X, Y and Z. Apply transforms to reset the object and then reset this proxy&#8217;s Origin. Move the proxy into position with the model so they occupy the same location, <strong>Snap<\/strong> (<span class=\"shortcutkey\">Shift<\/span> + <span class=\"shortcutkey\">S<\/span>) the cursor to it &#8211; <strong><em>Object \u00bb Snap \u00bb Cursor to Selected<\/em><\/strong> &#8211; then select the game mesh and snap <strong>Origin to 3D Cursor<\/strong> &#8211; <strong><em>Object \u00bb Set Origin \u00bb Origin to 3D Cursor<\/em><\/strong>. This positions the origin to approximate the objects Roblox compliant centre-of-mass.<\/div>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-origin.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-origin.jpg\" alt=\"Object Origin in Blender\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Side-by-side comparison of an accessory object (image-left) and its corresponding Bounding Box volume (image-right) showing how <strong>Origin to Geometry<\/strong> (in this instance) sets the Origin to different locations &#8211; in Roblox the objects Origin (image-left) will be ignored and effectively reset to match the Bounding Box origin.<\/i><\/p>\n<h4 style=\"font-weight:normal\"><span class=\"ez-toc-section\" id=\"single-uvimage\"><\/span><strong>Single UV\/Image<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Roblox operates on the basis that the entirety of object must be mapped to a single image\/texture atlas through a single material assignment. While multiple material <em>can<\/em> be used, largely to aid development, they must all unwrap to the same UV map and image. If an item is assembled to use multiple objects in Roblox Studio, each should be similarly mapped to their own distinct image.<\/p>\n<div style=\"background-color: #dedede; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Aside<\/strong>: while separate images can be used per object, preference should be to UV unwrap and map each to the same image where they form part of a larger whole, this reduces overheads in-game and the number of &#8216;draw calls&#8217; necessary to render something to screen. Note also that Roblox uses images sized to <a href=\"https:\/\/www.katsbits.com\/codex\/roblox-studio-vs-avatar-source\/\">power of two<\/a> within a maximum of 256 x 256 pixels &#8211; anything non-power of two, or larger, is typically rescaled up\/down to fit.<\/div>\n<p>In Blender, best practice should be to use a single material and image\/texture atlas assignment per object. Where multiple materials have been assigned, use the <strong>Material List<\/strong> in <strong>Material Properties<\/strong> to remove or collapse them as best as possible to ensure safe import into Roblox Studio. When using &#8216;PBR&#8217; materials that included other image map types &#8211; normal, roughness etc. &#8211; simply ensure materials are correctly set up for display in Blender, and that everything similarly maps to the same underlying texture atlas.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-uvmapping.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-uvmapping.jpg\" alt=\"Roblox safe UV mapping\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-material-setup.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-material-setup.jpg\" alt=\"Standard material setup\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i><strong>Image-top<\/strong>: for compatibility, best practice should be to map everything to the same image\/texture atlas. <strong>Image-bottom<\/strong>: PBR materials can be used comprising a standard set up routing through to Principled BSDF.<\/i><\/p>\n<h4 style=\"font-weight:normal\"><span class=\"ez-toc-section\" id=\"triangulate\"><\/span><strong>Triangulate<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Depending on the file format used to export from Blender, Roblox may provide an option to automatically triangulate imported models. While this works without issue in a general sense, best practice should be to manually process meshes Blender so the resulting &#8220;triangle soup&#8221; maintains its orientation integrity, that surfaces don&#8217;t &#8216;collapse&#8217; in on themselves due to the orientation of the original &#8216;quad&#8217; they were reduced from. In <strong>Edit Mode<\/strong> select the entire mesh (<span class=\"shortcutkey\">A<\/span>) and from the <strong>Face<\/strong> menu click <strong>Triangulate Faces<\/strong> (<span class=\"shortcutkey\">Ctrl<\/span> + <span class=\"shortcutkey\">T<\/span>) &#8211; <strong><em>Face \u00bb Triangulate Faces<\/em><\/strong>.<\/p>\n<div style=\"background-color: #fc0; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Important<\/strong>: if relying on Roblox to triangulate a mesh, during import and conversion, triangles can be flipped or rotated seemingly at random based on assumptions Roblox makes about the shape and structural flow of the mesh as it cannot know what the object is, or how individual triangles are supposed to describe the shape. To avoid this, after triangulation in Blender, be sure to check surfaces that form curves to make ensure they&#8217;ve not collapsed in on themselves &#8211; surfaces will look concave. If they do, they will need flipping or rotating. Switch to <strong>Edge Select<\/strong> (<span class=\"shortcutkey\">Ctrl<\/span> + <span class=\"shortcutkey\">2<\/span>) and select the diagonal edge shared between two collapsed triangles. From the <strong>Edge<\/strong> menu, click <strong>Rotate Edge CW<\/strong> (Clock Wise) or <strong>Rotate Edge CWW<\/strong> (Counter Clockwise) &#8211; <strong><em>Edge \u00bb Rotate Edge CW\/CCW<\/em><\/strong>. This changes the orientation of the shared edge and whether surfaces then appear concave or convex.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-mesh-prep-rotate-edge.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 100%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-mesh-prep-rotate-edge.jpg\" alt=\"Rotating Edges\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Use Rotate Edge to flip shared edges between triangles to change their orientation and whether they then appear to form a shared &#8216;concave&#8217; or &#8216;convex&#8217; surface.<\/i><\/div>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-mesh-prep-triangulate.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-mesh-prep-triangulate.jpg\" alt=\"Triangulate before export\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>For relatively complex models, especially those with curves or round shapes, preference should be to manually triangulate the mesh to maintain surface orientation integrity.<\/i><\/p>\n<h4 style=\"font-weight:normal\"><span class=\"ez-toc-section\" id=\"mesh-density\"><\/span><strong>Mesh Density<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Optimising meshes to reduce their complexity should be done at an earlier stage of development than at &#8216;prep&#8217; because it often necessitates potentially destructive reductions to mesh structure or complexity that might be &#8216;final&#8217; in appearance or form, for example, when &#8216;version building&#8217; to create a <em>high resolution<\/em> mesh for baking and its corresponding <em>low-resolution<\/em> bake target (the game mesh baked to), the low resolution should be optimised for eventual use not just, in this instance, the bake process.<\/p>\n<div style=\"background-color: #dedede; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Aside<\/strong>: while there are <a href=\"https:\/\/www.katsbits.com\/codex\/optimising-ai-generated-3d-models\/\">various ways<\/a> to <a href=\"https:\/\/www.katsbits.com\/codex\/imvu-optimising\/\">optimise meshes<\/a>, in this context, optimisation, <strong>Decimate<\/strong> should not be one of them because it&#8217;s a destructive process that reduces objects in an uncontrolled manner. Although it may be possible to use Decimate for &#8216;LOD&#8217; mesh generation, preference should be to manually optimise primary meshes (the mesh generally visible to the player).<\/div>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-mesh-prep-optimisation.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-mesh-prep-optimisation.jpg\" alt=\"Mesh optimisation\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Meshes should be heavily optimised, which might mean making use of Sharp edges and\/or strategically placed edge-loops, to get the most from a little as possible &#8211; if it doesn&#8217;t define noticeable shapes, remove it.<\/i><\/p>\n<h4 style=\"font-weight:normal\"><span class=\"ez-toc-section\" id=\"export-format\"><\/span>Export Format<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Models can be <a href=\"https:\/\/www.katsbits.com\/codex\/blender-roblox-which-format\/\">exported from Blender as OBJ, FBX or glTF<\/a>. Which one to use depends on what&#8217;s being exported. Static objects for example, can be exported to OBJ as they only need to included mesh and material information, whereas animated, or objects that include a skeleton of some description, can be exported to FBX, or preferentially glTF. Either way, subject to the prep work described above, Roblox will import the file, setting it up as a basic game object ready for use.<\/p>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-mesh-prep-export.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-mesh-prep-export.jpg\" alt=\"Mesh export for Rolox\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>For non-animated objects OBJ files can be used, else preference should be for glTF &#8211; FBX can be used but requires additional set  up once in Roblox Studio.<\/i>\n<\/p><\/blockquote>\n<h3><span class=\"ez-toc-section\" id=\"timestamps\"><\/span>Timestamps<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Times are approximate;<br \/>\n&#8211; 00:00 : Avatar Reference<br \/>\n&#8211; 03:00 : Transforms &#038; Origin<br \/>\n&#8211; 08:00 : Triangulate &#038; Edge Rotate<br \/>\n&#8211; 12:00 : Smoothing &#038; Sharp Edges<br \/>\n&#8211; 15:00 : Materials, Textures &#038; UVs<br \/>\n&#8211; 17:00 : Export Options<br \/>\n&#8211; 19:00 : Vertex Colors<br \/>\n&#8211; 20:00 : OBJ, glFT, FBX<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":10804,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,1072,230],"tags":[987,203,802,103,912,842,536,1074,1075,1134,351,919,910,815],"class_list":["post-10780","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blender","category-roblox","category-tutorials","tag-apply","tag-fbx","tag-gltf","tag-materials","tag-obj","tag-optimisation","tag-origin","tag-roblox","tag-roblox-studio","tag-texture-atlas","tag-transform","tag-triangles","tag-triangulate","tag-uvmap"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/10780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/comments?post=10780"}],"version-history":[{"count":25,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/10780\/revisions"}],"predecessor-version":[{"id":10829,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/10780\/revisions\/10829"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/media\/10804"}],"wp:attachment":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/media?parent=10780"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/categories?post=10780"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/tags?post=10780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}