As a Roblox Developer, it is too hard to programmatically read the geometry of meshes that I did not personally upload that I use in my game.
Realistically, It is very common to work on a game with thousands of assets uploaded by various accounts/contributors because Roblox Studio’s natural workflow results in models being uploaded under the user’s account. We are very close to being able to idiomatically work with meshes in our games, the closest we’ve gotten is with EditableMesh, and the last major roadblock was introduced with the permissions update of October 2024. post
There is consistent community feedback pointing to reasons why we want this:
- Raycasting Directly on Render Geometry A use case suggested by Roblox’s own API docs
- Mesh Analysis Tooling post
- Skin Texture Projection post
- Minimap Renering post
- Emulating Roblox’s Humanoid texture compositor post
- Extracting and Building Collision Data which is especially important for certain features in server authoritative games.
- Analyzing meshes used to cheese competitive games post
We can freely use unpermissioned 3D assets in the game, and access its data through multiple roundabout paths, so as a developer it makes little sense why we are not afforded this ability idiomatically. Our best options are/were:
- Manually: Via exporting assets as .obj files from Roblox Studio
- Programmatically: Via downloading the asset directly through the Roblox Web API and decoding the binary mesh file. (this is the current work around)
- Previously: Via the EditableMesh API, before the 2024 permissions update dramatically reduced access.
Proposed Solutions
The reason given for this restriction is vague beyond “preventing misuse” so it is hard to speculate on potential solutions, but here are some which would solve our geometry data blockers to varying degrees.
- Restrict publishing after loading unpermissioned assets: If a session has loaded an asset it doesn’t own into an EditableMesh, disallow the ability to publish assets programmatically for the remainder of that session.
- Heavy rate limiting: Allow download of 5 - 10 assets per minute, with a burst cap of 200 or so. Bulk scraping is impractical, but reads for game logic or tooling become feasible.
- Add a new lightweight geometry API besides EditableMesh: It can return a pure-luau structure, or a set of buffers. Something like
AssetService:GetMeshDataFromContentAsync(content) -> {minBound, maxBound, vertexList, faceList, normalList, UVList, ...} - Read-only EditableMesh: This is perhaps the most obvious approach, but if it solved the problem, it should have been done already.