{"id":10738,"date":"2026-07-30T09:49:06","date_gmt":"2026-07-30T08:49:06","guid":{"rendered":"https:\/\/www.katsbits.com\/codex\/?p=10738"},"modified":"2026-07-30T09:56:34","modified_gmt":"2026-07-30T08:56:34","slug":"roblox-accessory-fitting-tool","status":"publish","type":"post","link":"https:\/\/www.katsbits.com\/codex\/roblox-accessory-fitting-tool\/","title":{"rendered":"How to use Roblox Accessory Fitting Tool"},"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-6a6bb647b3a05\" 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-6a6bb647b3a05\"  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-accessory-fitting-tool\/#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-accessory-fitting-tool\/#tool-vs-explorer\" >Tool vs. Explorer<\/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-accessory-fitting-tool\/#blender-mesh-prep\" >Blender Mesh Prep<\/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-accessory-fitting-tool\/#image-format\" >Image Format<\/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-accessory-fitting-tool\/#vertex-colours\" >Vertex Colours<\/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-accessory-fitting-tool\/#safe-zone-volume\" >Safe Zone Volume<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.katsbits.com\/codex\/roblox-accessory-fitting-tool\/#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\/v7b94f0\/?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\/L28Ng6Hia1E?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\/7668235764689276182?music_info=0&#038;description=0\" width=\"270\" height=\"480\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"description\"><\/span>Description<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To publish an Accessory or attachment to <strong>Roblox Marketplace<\/strong> products must be assembled using the <strong>Accessory Fitting Tool<\/strong>, <a href=\"https:\/\/www.katsbits.com\/codex\/roblox-manual-accessory-setup\/\">not because this is the only way to make an accessory for Roblox<\/a>, rather because the Tool verifies the resulting game object and ensures compliance with <a href=\"https:\/\/create.roblox.com\/docs\/production\/creator-store\" target=\"_blank\">Roblox Creator submission and product guidelines<\/a>. The following walks through that process.<\/p>\n<p><b>Duration<\/b>: total c. 20 mins (00:20: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>\n<strong>Design note<\/strong>: additional considerations when the Accessory Tool to make items for Roblox using Blender;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"tool-vs-explorer\"><\/span>Tool vs. Explorer<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>As briefly mentioned in the description, the <strong>Accessory Fitting Tool<\/strong> is not specifically necessary to create an accessory or attachment item for Roblox as they can be <a href=\"https:\/\/www.katsbits.com\/codex\/roblox-manual-accessory-setup\/\">assembled manually in the project Explorer<\/a>. This is generally done for items used within an experience. To upload and make accessories available in <strong>Roblox Marketplace<\/strong>, accessories <strong><em>must<\/em><\/strong> be set up using the <strong>Accessory Fitting Tool<\/strong> as the process doing more than just assembling items; during set up the tool inserts a non-editable data schema that&#8217;s used to verify (read: applies a &#8216;security layer&#8217;) and categorise items for sale &#8211; scripts, triggers and other potentially harmful material is stripped to prevent the publication of malware or other forms of malicious content.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"blender-mesh-prep\"><\/span>Blender Mesh Prep<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Before export from Blender ensure the accessory mesh is prepped for use. Typically this might mean (in no particular order);<\/p>\n<div style=\"background-color: #e7faea; color: #000; width: 98.5%; padding: 1.0em;\">\u2022 Model in-situ, re-centre at 0,0,0 for export<br \/>\n\u2022 <a href=\"https:\/\/www.katsbits.com\/codex\/import-roblox-avatar-blender\/\">Scale relative to avatar<\/a><br \/>\n\u2022 Apply all transforms (<span class=\"shortcutkey\">Ctrl<\/span> + <span class=\"shortcutkey\">A<\/span>)<br \/>\n\u2022 Triangulate mesh (<span class=\"shortcutkey\">Ctrl<\/span> + <span class=\"shortcutkey\">T<\/span>)<br \/>\n\u2022 Turn edges (optional)<br \/>\n\u2022 <a href=\"https:\/\/www.katsbits.com\/codex\/fixing-mesh-orientation-roblox\/\">Reset\/set object Origin<\/a> (<em>Object \u00bb Set Origin \u00bb [option]<\/em>)<br \/>\n\u2022 Single UV Map per object<br \/>\n\u2022 Single Texture atlas per object<br \/>\n\u2022 Optimise meshes<br \/>\n\u2022 <a href=\"https:\/\/www.katsbits.com\/codex\/blender-roblox-which-format\/\">Export to glTF or FBX<\/a> for complex models, OBJ for simple diffuse only (no PBR)<\/div>\n<p><\/p>\n<div style=\"background-color: #dedede; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Aside<\/strong>: for more details on prepping meshes for Roblox in Blender see <a href=\"https:\/\/www.katsbits.com\/codex\/roblox-mesh-prep-blender\/\">How to Prep Models\/Meshes for Roblox in Blender<\/a>.<\/div>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-mesh-prep.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-mesh-prep.jpg\" alt=\"Mesh prep in Blender for Roblox\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>As part of the preparation process objects should have a single UV mapped to a single image\/texture atlas.<\/i><\/p>\n<h4><span class=\"ez-toc-section\" id=\"image-format\"><\/span>Image Format<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Blender can use any number of image formats interchangeably, even within the same project. For export to Roblox however, images should be swapped out for compatible formats to avoid Roblox Studio import issues. Supported formats are <strong>JPG<\/strong>, <strong>PNG<\/strong> and <strong>WebP<\/strong>. This applies to single <em>diffuse only<\/em> materials, or materials that use PBR (Physically Based Rendering) texture maps, i.e. normal, roughness, metallic etc.<\/p>\n<div style=\"background-color: #fc0; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Important<\/strong>: if normal maps are being used ensure they are saved <strong>uncompressed<\/strong> or using <strong>lossless compression<\/strong> to avoid visual artifacts being rendered, e.g. avoid using the standard JPG format.<\/div>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-image-format.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-image-format.jpg\" alt=\"Lossless image format\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Using GIMP to (re)save a TGA image as a lossless WebP image.<\/i><\/p>\n<h4><span class=\"ez-toc-section\" id=\"vertex-colours\"><\/span>Vertex Colours<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Models exported for Roblox can be painted with <strong>vertex colours<\/strong> (vertex colors) in Blender and exported without issue. In Roblox however, their use is subject to a rendering limitation; vertex colours and images are not, by default, blended together if they&#8217;re part of the same material as they can be in Blender through the the <strong>Mix Color<\/strong> shader. The option to include vertex colours, without using a custom shader, is either\/or; either the mesh is painted in full using vertex colours, or the mesh is textured using a bitmap image.<\/p>\n<div style=\"background-color: #dedede; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Aside<\/strong>: where vertex colours have been used, for example to  <a href=\"https:\/\/www.katsbits.com\/codex\/bake-vertex-color\/\">baking as a diffuse image<\/a>, be sure to decouple the nodes prior to export to prevent issues.<\/div>\n<p><\/p>\n<div style=\"background-color: #fc0; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Important<\/strong>: using vertex colours to paint a mesh may mean structurally rethinking it. For example, eyes can be painted to an bitmap\/image with relative ease, whereas painting them using vertex colours necessitates the mesh having to physically including &#8216;eyes&#8217; as part of the object else there&#8217;s either nothing to paint, or not enough surface data to paint to.<\/div>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-vertex-colour.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-vertex-colour.jpg\" alt=\"Vertex colour painted mesh\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>Model painted entirely using vertex colours in Blender that, while exportable, can&#8217;t blended with an image without a custom shader.<\/i><\/p>\n<h4><span class=\"ez-toc-section\" id=\"safe-zone-volume\"><\/span>Safe Zone Volume<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>During set up, as the Accessory Fitting Tool proceeds through the process, a fitting phase is presented that displays a semi-transparent volume around the attachment point previously established. This is a <strong>safe zone<\/strong>, an area meshes must remain or be contained within. anything outside this invalidates the game object. This determination, whether something is inside or outside, valid or invalid, is not determined by the model itself, the object visible to the user. It is instead determined by the models overall <strong>Bounding Box<\/strong>.<\/p>\n<div style=\"background-color: #fc0; color: #000; width: 98.5%; padding: 1.0em;\"><strong>Important<\/strong>: there are essentially two <em>volumes<\/em> at play here;<\/p>\n<p>1) the <strong>objects volume<\/strong>, as defined by its bounding box.<br \/>\n2) the <strong>overall volume<\/strong> occupied by the object in the game world.<\/p>\n<p>While the bounding box never changes, because its defined by the models physical characteristics, the amount of space the overall object occupies does, depending on it&#8217;s orientation in the world. This is why models can <em>appear<\/em> correct in the tool but still error out, the bounding box position in space is the culprit not the visible model.<\/div>\n<p>In practice this means that if the object is manipulated off-axes, or in a way that changes the orientation of the Bounding Box, any part of <em>that<\/em> that pokes through the safe zone, will invalidate the accessory despite the visible mesh appearing to be inside.<\/p>\n<div style=\"background-color: #8080ff; color: #fff; width: 98.5%; padding: 1.0em;\"><strong>Alert<\/strong>: if the accessory being assembled needs to extend outside the safe zone associated with a given attachment point, e.g. an arm-length gauntlet, it will need to be set up, configured and published as <em><strong>clothing<\/strong><\/em> to bypass the single attachment point limitation of the Accessory Fitting Tool as multiple body zones would need to be accommodated &#8211; a gauntlet might need &#8216;hand, &#8216;lower arm&#8217; and partial &#8216;upper arm&#8217;, whereas a accessory can only use &#8216;hand&#8217; or &#8216;lower arm&#8217; or &#8216;upper arm&#8217;.<\/div>\n<p><a href=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-safe-zone.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" style=\"width: 98.5%; height: auto;\" src=\"https:\/\/www.katsbits.com\/images\/tutorials\/roblox\/roblox-accessory-safe-zone.jpg\" alt=\"Accessory safe zone\" width=\"900px\" height=\"500px\" border=\"0\" \/><\/a><br \/>\n<i>The green outline approximates the objects overall volume, as defined by its Bounding Box, which pokes through the &#8216;safe zone&#8217; because the model has been rotated off-axis, invalidating the accessory.<\/i><\/p>\n<\/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 : Model Prep &#038; Export<br \/>\n&#8211; 05:00 : Roblox Import<br \/>\n&#8211; 07:00 : Accessory Tool<br \/>\n&#8211; 10:00 : Bounding Box Issues<br \/>\n&#8211; 13:00 : Accessory Test<br \/>\n&#8211; 16:00 : Summary\/Recap<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":10860,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,1072,230],"tags":[575,987,1139,704,120,203,802,1141,912,536,1017,1074,1075,1106,910,399,393,908,1142],"class_list":["post-10738","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blender","category-roblox","category-tutorials","tag-accessory","tag-apply","tag-attachment","tag-avatar","tag-blender","tag-fbx","tag-gltf","tag-jpg","tag-obj","tag-origin","tag-png","tag-roblox","tag-roblox-studio","tag-tga","tag-triangulate","tag-unit-scale","tag-units-of-measurement","tag-vertex-color","tag-webp"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/10738","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=10738"}],"version-history":[{"count":55,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/10738\/revisions"}],"predecessor-version":[{"id":10873,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/posts\/10738\/revisions\/10873"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/media\/10860"}],"wp:attachment":[{"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/media?parent=10738"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/categories?post=10738"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.katsbits.com\/codex\/wp-json\/wp\/v2\/tags?post=10738"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}