I'm working on a scene involving a Riichi Mahjong table. Here's what I got:

My scene so far

All these tiles are linked duplicates of one mesh. Now before me is the most daunting task, which is giving all these tiles faces.

Here is the reference picture I'm working with - let's ignore the other things that are going on here, like some tiles being red or gray or shiny:

Reference picture

All the faces I want to use are available in SVG format here: https://github.com/FluffyStuff/riichi-mahjong-tiles. For example, the Hatsu tile face looks like this: https://github.com/FluffyStuff/riichi-mahjong-tiles/blob/master/Regular/Hatsu.svg

Now ideally, instead of having to carve all the faces by hand, the idea I had is to assign each tile a custom property pointing to one of these SVG file on disk, and having Blender either put on a bump-mapped texture or - since Blender can work with curves - carve out the face with a groove using a boolean operation.

Here's the result I'm hoping for:

Desired result

The problem at hand is how to make all this work as little repetitive as possible. Do you have any pointers how I should go about achieving this? Could Python somehow help me with this?


2 Answers 2


Unless you're in extreme close-up / product shot, you should be able to use the 'Export' .png images from your referenced archive for texturing.

My first step was to create a single-image tiled array of the image collection, with a margin, using an external image-processor. (In my case, the montage command-line utility)

  • montage *.png -geometry 600x800 -borderwidth 50 -bordercolor white mjt.png

Then the montage was further put through a threshold, and blurred, to produce the 3 images below:

enter image description here

Once you have these texture-images available, you can create a 2D Array of tiles, using the 'Offset U' and 'Offset V' settings to make each array element look up its texture from the correct location in the image:

enter image description here

The blurred version of the image, masked by the threshold version, can be used as a reasonable height-map for use with Vector > Bump, in a material:

enter image description here

Once the tile-array's material and geometry is settled, the Array modifier can be applied, and in Edit Mode, P separated by loose parts. With all selected, each tile's origin can be Header > Object > Set Origin to its own geometry.

enter image description here

  • $\begingroup$ Fantastic, thank you. Beautiful work! $\endgroup$ Mar 6 at 22:56

The easiest thing to do is definitely use the images as bump maps. If you created a black and white version of the map, you can use an image editing software like Photoshop to generate a bump map for you. You can skip that step and just do it mostly in the shader, but it won't look quite as good.

You can use SVG files in the way you want, but they usually require cleaning up before and after the boolean step because they tend to cause issues when you go to apply your bevels. With details as fine as calligraphy, I suspect that would be a very tedious process.

Here's a basic pick of what you're going to be doing a lot for this project if you go the bump map route: enter image description here

You need to select the face you want and position it over the part of your image you want. You'll have to do this for every piece.

  • $\begingroup$ How would I go about assigning a bump map to all tiles so deciding which face to use would be a matter of simply changing the file name parameter? Ideally the face color should be picked from the file as well. $\endgroup$ Mar 4 at 1:19
  • $\begingroup$ You're going to have to make your pieces unique instead of linked no matter what you do. Import you image as texture and align the UV of your piece to the part of image you want. I'll update my answer with a basic picture. $\endgroup$ Mar 4 at 1:28
  • 1
    $\begingroup$ Very helpful, thanks a lot! $\endgroup$ Mar 6 at 22:57

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .