A Quick Guide to Using Crazy Catted
Most people run into Crazy Cattl3d after they've already spent hours trying to batch-generate low-poly assets manually in Blender. That's exactly what I did. I was building a voxel-style environment for a client project and needed hundreds of scattered decorative meshes — rocks, broken furniture, foliage clumps — all with consistent topology and UV orientation. I found the tool on a GitHub repo that hasn't been updated since mid-2024. It still works, mostly. Let me walk through what you need to know before you spend a few hours fighting with it. It's a standalone utility with a Blender Python plugin wrapper. The core program runs separately and takes in a seed object — a single mesh — and an input grid or point cloud. It outputs a scattered distribution of that mesh with randomized rotation, scale, and minor vertex displacement. The Blender plugin handles the import, viewport preview, and export pipeline. It's designed for one specific workflow: terrain scatter for indie games and low-poly environments. It will not help you with character placement, vehicle distribution, or anything that requires collision-aware scattering. If that's what you need, you're better off using Blender's native particle system or a dedicated tool like World Machine. The project lives at cazzycatted.github.io, though the main link goes to a GitLab mirror that hosts the actual releases. The GitHub repo is more of a README graveyard with the changelog preserved. I'd recommend cloning the repo directly rather than downloading a zip from the main page. The commit history shows someone pushed a Windows build in March 2024 and a macOS build shortly after. Both are compiled with PyInstaller and seem to work on Python 3.10 and 3.11. There's no Linux build, and honestly the source itself isn't well documented beyond the README.
Installation and Setup
Download the latest release from the GitLab projects page. Extract the archive. The Blender plugin goes into your usual addons directory — usually ~/.config/blender/3.x/scripts/addons/ on macOS or %APPDATA%\\Blender Foundation\\Blender\\3.x\\scripts\\addons\\ on Windows. The standalone binary goes wherever you keep your command-line tools. Before you enable the addon in Blender, you need to make sure you have NumPy, SciPy, and Trimesh installed. The bundled executable includes its own Python environment, but the Blender plugin uses whatever Python your Blender install ships with. Mismatched library versions are the most common reason the plugin fails to load. If the addon panel doesn't appear after installation, check the Blender console for an ImportError. In my case it was a Trimesh version conflict — I had 3.15.x installed and the addon expects 3.18+. Running pip install trimesh==3.18.2 inside the Blender Python interpreter fixed it. That took about twenty minutes of troubleshooting because the error message just says "module not found" without specifying which one. Once the addon is enabled, you'll find a new panel in the 3D viewport sidebar under the "Crazy Cattl3d" tab. It's clean enough. You drop your seed mesh into the object field, set your distribution method, configure the parameters, and hit Generate.
The Workflow
Here's how it actually feels to use day to day. Start with a single mesh you want to scatter. Apply all transforms first. If your seed has non-uniform scale baked in, the randomization breaks. It doesn't warn you. It just produces garbage output and you'll spend an hour wondering why every instance is stretched differently. The distribution methods are the main settings. Random places instances completely at random within a defined area. Grid distributes on a regular mesh. Poisson disc is the useful one — it keeps instances at a minimum distance from each other, which prevents clustering. For terrain work, Poisson disc with a radius of about two times your average mesh size gives you the most natural-looking spread. The default radius is too small and you end up with dense patches that look artificial. Rotation randomization works on three axes, but here's the catch: the Y and Z axes are world-space, not local-space. I learned that the hard way when I was trying to scatter trees and half of them were tilted sideways because their local forward axis didn't align with world Z. The workaround is to orient your seed mesh so its primary upright axis points along world Z before you import it. Then lock the Y and Z rotation ranges and only randomize X if you want leaning variation.
Get the Full Details

Scale randomization has a minimum and maximum per axis. I recommend keeping the variance between 0.8 and 1.3. Beyond that and your scattered objects start looking like they belong in different scenes. The vertex displacement slider is where most beginners waste time. It adds random noise to individual vertices of each instance. At values above 0.05 the meshes become unrecognizable. At 0.02 to 0.04 you get enough variation to break up the repeating pattern without distorting the silhouette. That range is where the tool actually shines. The export options give you a few choices. You can export as a single merged mesh, individual objects, or a .blend file with all instances as separate linked objects. For game engines, merged mesh is almost always what you want. OBJ export works but the normals come out messy — I usually run a "Recalculate Outside Normals" pass in Blender after import. FBX export is fine if you're sending stuff to Unreal or Unity. The vertex count on the exported mesh scales linearly with the number of instances, so if you're scattering 500 rocks and each rock is 2,000 vertices, you're looking at roughly a million vertices in a single mesh. That's manageable for mobile but heavy for console.
Things That Will Go Wrong
I ran into a specific edge case that the documentation doesn't mention. If your seed mesh has any non-manifold geometry — and I mean literally any vertex that isn't shared by at least two faces — the Poisson disc distribution crashes. Not gracefully. The whole Blender session freezes and you lose unsaved work. I discovered this when I was scattering a custom rock mesh that I'd retopologized quickly. One edge had a dangling vertex from an incomplete delete. The tool hung for about three minutes before I killed the process. The fix was to select all vertices in Edit Mode, press M, and choose "By Distance." That merged the stray vertex and the distribution worked immediately. Another issue: the random seed control. The plugin has a seed field, but it's not stable across runs unless you freeze all other parameters. Change the distribution radius by even 0.01 and the output changes completely, not just slightly. If you're iterating on layout, save your parameter set as a preset. The addon has a basic preset system but it only saves the visible fields, not the internal random state. I ended up writing a small Python script that serializes the full parameter dictionary to JSON so I could restore exact layouts. It's about forty lines and worth the time to write once. The biggest limitation is that the tool doesn't support heightmap-aware scattering. Everything is placed on a flat plane by default. You can use an existing mesh as a distribution surface, but it samples uniformly from the mesh vertices, which means slopes get over-scattered and flat areas get under-scattered. For a terrain that varies between 0 and 60 degree angles, this produces visibly incorrect density. I got around it by baking my terrain into a heightmap, generating a proxy mesh in Blender with displaced vertices matching the height data, then using that proxy as the distribution surface. It adds a step but the result is correct.
When You Should Skip It
Don't use Crazy Cattl3d if you need physics-based placement, collision detection, or material variation across instances. It also doesn't support GPU acceleration, so distributions larger than about 1,000 instances will take several minutes depending on your CPU. For anything that large, Houdini or Blender's Geometry Nodes are faster and more flexible, even if they have a steeper learning curve. The tool is fine for small to medium scatter jobs — under 500 instances, single material, flat or near-flat surfaces. It's genuinely useful if you're making a low-poly game and need quick environmental detail. It's not useful if you're doing architectural visualization or any work that requires precision placement. I still reach for it occasionally when I need to fill a scene with rocks or debris in under ten minutes, and for that purpose it does exactly what it promises.
