Roblox Mesh Format

This is a highly needed subject! Good job you uploaded it as a load of people ask how this works.

3 Likes

This was previously a DevHub article that I wrote, but it was recently taken down for some reason. I guess they decided it was too niche to maintain, so I’ll take it from here.

9 Likes

DevHub articles are documentation. We do not document and do not promise anything about the mesh format, it’s purely internal and we can drop support for any format at any point once we convert all existing assets - so DevHub is not a good place for this information.

10 Likes

How do you actually get the meshes from the roblox server?

3 Likes

This is another one of those “things I’m not entirely sure I will need but I’ll learn it anyways”.

Great post! I’m surprised you actually took the time to decipher their system.

6 Likes

Edit from 2023: This edit is severely belated, but a little while after the audio privacy update, asset?id= stopped returning raw data and now just 404s. While there may be other ways to retrieve raw assets from the website, I don’t know anything about those methods. Please know that the following information is long outdated.


The asset?id=[number] link always provides the raw asset. If you copy the link for an asset and paste it into your browser, Roblox will simply provide you the asset as a data stream. For example, using this decal, you can use the asset link, which returns just the data for the image. Web browsers will cause a download prompt to appear. You can then apply the .png extension locally, and your OS will correctly register that the image is a PNG file.image
This is also applicable to everything else that Roblox serves in this manner, e.g. audio and meshes.

8 Likes

Hey everyone! I have extended this to include a WIP specification for version 4.00 of Roblox’s mesh format. I still haven’t fully deciphered the purpose of all the data it stores, but I’ve got it down enough to where it can at least be read fully.

Check out the version 4.00 [WIP] section to learn more!
Let me know if you guys have any insights to things I left stubbed out or wasn’t sure about.

10 Likes

Some time ago, I discovered some Python 2 code for a .mesh parser on GitHub and modified it to run standalone. Though these changes weren’t major, I’ve since lost it to hard-disk damage.

5 Likes

Um I have a question I gotta ask, Um how do you write the script mesh format 4.00 on the roblox studio?. Because I was trying to import a mesh the has like between 46k and 70k tris. And I was trying to figure out a way how to import them. But I don’t how to make a script for it to reduce it’s self. And I really need some help to learn how to do it.

Has anyone written anything that can read 1.00 mesh data and export it to a .obj?

1 Like

Really very interesting, I think I will use it for a project. Thanks for that! P.S.: How did you even get this information out?

I reverse engineered it, nothing too special lol.

2 Likes

Wow, I didn’t know. Anyway, it sounds very interesting, thanks for that!

This to me, seems to be incorrect, at least for 1.00 meshes. I wrote a parser for 1.x and 2/3 meshes, and whenever I invert the tex_V coord like mentioned here, textures look incorrect


This could just be a quirk with THREE.js or something with my code.

3 Likes

From checking some of the S15_Lola V4.00 mesh files I have the following comments that may be useful.

  1. The meshHeader field numSkinData is only 16 bits not 32 (and is followed by a 16 bit number set to 1 in mesh files used for S15_Lola)

  2. There is no meshHeader field to define the number of Envelopes so it is the same as numVertices except when the numBones is zero when there are no Envelope structs in the file.

  3. The SkinData struct appears to be an extension to the LOD data (the facesBegin and facesLength contain the same information).

  4. The SkinData struct would appear to define a different section of the shared vertex and face array and to allow the mapping of bone indices to the bone array.

2 Likes

I did notice a couple of these the other day when I was fixing some implementation issues with the mesh format in Rbx2Source

2 Likes

Hey everyone.

I’ve made a revision to the spec which accounts for the new tangent vector data, which is packed into the 4 bytes that were previously used for the UV’s dummied out tw Z-coordinate.

Let me know if you have any questions!

3 Likes

Made another set of revisions to finalize a majority of the version 4.00 mesh format specification!

4 Likes

ofc maybe we can of version format revisions that’s how mesh like question

One last update to specify how the envelopes are tied to the mesh subsets and to clear the last 2 undefined bytes in the MeshHeader. The version 4.00 spec should be 100% complete now!

Let me know if you guys have any questions.

2 Likes