Free low poly assets for Godot: where to get them and how to get them in
Godot is the engine most low poly packs forget. The big free sources ship for Unity first, so a Godot project is a series of small conversions. This guide is the whole of it: which formats Godot reads and which to ask for, every free source worth knowing and what its licence lets you do, the import step by step, keeping the shading flat and the colours right, adding a collider, and putting a forest down without a thousand nodes. The articles underneath compare the packs and put a forest down with MultiMesh; the import itself, setting by setting, is the Godot OBJ article, and levels of detail in Godot keep the far trees cheap.
- Free low poly asset packs compared: Kenney, Quaternius, KayKit, Poly Pizza and the restThe free sources of low poly 3D models compared on licence, formats, style, size and what each is best for, with the paid ones for context, and where a builder fits beside them.
- A forest in Godot 4 with MultiMeshInstance3DHow to put thousands of low poly trees in a Godot 4 scene in one draw call with MultiMeshInstance3D, populating it from code with varied transforms and colours, giving the far ones levels of detail, and where the scatter add-ons take over.
Formats Godot likes
- GLB or glTF is Godot's native format. Materials, scenes, node hierarchy and animation all come across, and nothing needs converting. Take it whenever it is offered.
- OBJ imports directly as a mesh resource, with materials from the
.mtlbeside it. Good for static props; it carries no hierarchy or animation. - FBX imports in Godot 4.3 and later through the built-in ufbx importer; before that it needed the FBX2glTF tool, which the editor prompts for. If a pack offers GLB as well, take that.
- Blend files import if Blender is installed and the editor knows where it is, which is convenient but ties the project to that machine.
- DAE (Collada) still imports, and a few older packs ship it. It works; GLB is better.
Where the free packs are
| source | licence | formats | what it is |
|---|---|---|---|
| Kenney | CC0 | GLB, OBJ, FBX | Hundreds of kits in one consistent style, nature and city first |
| Quaternius | CC0 | GLB, OBJ, FBX | Large nature, character and prop packs, cleanly made |
| KayKit | CC0 | GLB, FBX | Kits with a hand-painted flavour, several made with Godot in mind |
| Poly Pizza | mostly CC0, some CC BY | GLB, OBJ | A search engine over free models; check each licence |
| Godot Asset Library | varies | scenes | Smaller pool, a low poly tag, sometimes Godot-ready scenes |
| PolyMason | yours to use | OBJ now, GLB next | Built to your size in the browser, one at a time, free |
CC0 means no conditions at all: use it, sell a game with it, modify it, no credit needed. CC BY needs a credit somewhere, a line in the game's credits is enough. Read the licence on anything from a marketplace; "free" there often means free for personal use.
Every pack shares one problem: the tree is the same tree in every game that uses it. The other route is to build the model to the size and shape you want. PolyMason's tree builder does that free, in the browser, twenty-four species, exported as OBJ with GLB next. The packs compared article goes source by source.
Importing an OBJ
Drop the .obj, its .mtl and any texture into the project folder together. Godot imports the OBJ as a mesh resource. Add a MeshInstance3D to the scene and set its Mesh property to the imported file, or drag the file from the FileSystem dock into the 3D viewport. The materials from the .mtl come with it, one surface per material.
If you would rather have a scene with a node per object than one mesh, select the file, open the Import dock, change Import As to a scene, and Reimport.
Scale. Godot's unit is the metre, so a file made in metres is the right size. A model that arrives tiny was made in centimetres, or exported from a tool that scaled it. Fix it once in the Import dock's scale setting and reimport, rather than scaling the node; a scaled node scales its collider and its children too.
GLB is the same drag and drop, and arrives as a scene: right-click it in the FileSystem dock and choose New Inherited Scene to edit it, or instance it into your scene as it is.
Keeping it flat
Godot uses the normals in the file and generates smooth ones only when there are none. A model exported with flat normals shades flat with nothing to set, and there is no smoothing angle in Godot to adjust. If a pack's model comes in smooth, the fix is in the tool it came from: shade it flat there and re-export, or use the GLB from the same pack, which usually carries the intended normals.
For the colours, low poly packs use one small texture with a square per colour, and so does PolyMason: the OBJ, its .mtl and the PolyMason palette PNG go into the project together, and Godot makes one StandardMaterial3D with the palette as its albedo texture. The palette is the same file for every model from here, so a scene of them shares that one material. Two settings on that material make the flat look read better under Godot's default lighting: turn Specular down, under Metallic, and set the texture's filter to Nearest in the material's Sampling section if you want hard-edged blocks. Repainting a block in the PNG recolours every face that points at it.
A model with a material per colour, which some packs use, gives you a StandardMaterial3D per surface instead, each editable in the inspector, at the cost of a draw call per material.
Adding a collider
A MeshInstance3D has no collision. With the node selected, the Mesh menu in the 3D viewport's toolbar offers Create Trimesh Collision Sibling for exact collision on static props, and Create Single Convex Collision Sibling for a cheaper hull. For a tree, neither is what you want: a CollisionShape3D with a cylinder or capsule shape the size of the trunk, as a sibling under a StaticBody3D, lets the player walk under the canopy and bump into the trunk, which is how trees behave in games. Rocks and buildings take a trimesh or a box.
Putting many of them down
A forest of separate MeshInstance3D nodes works, up to a point. A MultiMeshInstance3D draws thousands of copies of one mesh in one draw call, with a transform and optionally a colour per instance, and Godot's automatic mesh LOD keeps the distant ones cheap. Godot's scattering add-ons build on it; for a hand-placed scene, duplicating nodes is fine until it is not. The forest article populates a MultiMesh from code and from a scatter add-on.
The things that go wrong
- Grey model: the
.mtlor the texture was not beside the.objwhen it imported. Put them together and Reimport. - Tiny or huge model: units, see Scale above.
- Model on its side: exported Z-up from Blender with the wrong Forward and Up settings. Re-export with -Z forward, Y up.
- Smooth where it should be flat: no normals in the file. Re-export flat, or take the GLB.
- Dark underside on leaves: the material is single-sided and the leaf planes are seen from behind. Set Cull Mode to Disabled on that material, or use a closed foliage mesh.
The other guides
- Flat shading in Unity for low poly modelsWhy a low poly model goes smooth when it lands in Unity, what the importer's normals and smoothing angle do, the three places to fix it, and how to keep the colours flat too. The complete guide, with the detail in three articles underneath.
- The OBJ file format, explained for game enginesEverything in an OBJ file and its MTL, everything it leaves out (units, axes, colours), how it compares with FBX, GLB and STL, and how Unity, Godot and Unreal each import one without the model arriving tiny, sideways or grey.
- LODs and billboards for low poly modelsHow levels of detail work, what triangle counts are reasonable for low poly trees, rocks and buildings, how to make the levels so the swap does not pop, billboards and impostors for the far distance, and the LOD setup in Unity, Godot and Unreal.
Or build a tree and see what comes out.