I know this might be very specific, but I thought that maybe an expert here could help me out a bit here.

How, or what is the general workflow to replicate this "hexagonal armor" effect on surfaces in Blender?

Enter image description here

  • $\begingroup$ If you mean the small shapes, there is a curve with the shape included in blender, then you just need an array to create copy...Or are you referering to the animation? You need to add mo re details $\endgroup$
    – Emir
    Commented Jun 2, 2021 at 14:03
  • $\begingroup$ This can also probably be achieved with geometry nodes as well, similar to this youtu.be/_bdcQXMQ4e0?t=33 $\endgroup$
    – Luciano
    Commented Jun 3, 2021 at 9:11
  • $\begingroup$ If this is from a game, this is almost certainly done via shaders (geometry/tesselation), since that allows the poly budget to be way lower. $\endgroup$ Commented Jun 4, 2021 at 16:32
  • $\begingroup$ Not sure how helpful this will be, but reading your question instantly made me remember this video I watched once. It is about Maya though. youtube.com/watch?v=0kjXzrGUgYQ $\endgroup$ Commented Jun 5, 2021 at 13:27

3 Answers 3

  • Enable addon Extra Objects
  • Add Object Shift+A > Mesh > Extras > Honeycomb in desired amount of cels setuped in properties panel (left-bottom corner of 3Dview) with max Edge Width that fills cells with central vertex
  • Duplicate Shift+D and Separate Ctrl+P one cell, add Solidify modifier
  • Parent to Honeycomb Ctrl+P
  • for Honeycomb object enable under Object Properties > Instances > from Vertices
  • Add Wave modifier to Honeycomb object

enter image description here

Or ... It can be done with Animation nodes in a more advanced way ... or in combination with Geometry nodes ... I like the old-school way :)


I guess there has to be a shader approach, although I think @vklidu's answer is maybe more practical? It's always tricky trying to reproduce an effect that someone else has more than likely reached by random walk :)

This uses the hex-grid cluster discussed at the bottom of this answer. It yields a hexagonal tiling of the UV space, with a (-0.5 to 0.5) UV-per-tile:'Cell UV', and a '2D Index', which is the original UV's coordinate at the center of each hex.

In addition, it borrows this group, from earlier in the answer, 'Dist.Hex':

enter image description here

..which, given the Hex UV, gives us the distance from the edge of the hex.

These can be used to bump / displace a surface:

enter image description here

In this version, a ramp of the 'Dist.Hex' is used to mask the overall displacement, set by the 'Per Hex Displacement' cluster.

..which gets us this far..

enter image description here

Looking at the original, I think, unlike here, you would probably have to sync. the overall displacement of the surface with the displacement-per-tile: (using the same texture for both). The overall displacement could be done in the geometry, per-tile in the shader.

Also there seems to be a lot of other jiggery-pokery going on in the reference. Depth of field? Looking at everything through a reflective, distorting, lens-like object? Or doing that in post?

  • 2
    $\begingroup$ Aaah, I knew there must be a simpler solution than mine! Though I searched this site for hexagons and couldn't find anything - proves the terribleness of titles like "How To Do UV Indexing Like This?" $\endgroup$ Commented Jun 3, 2021 at 11:59
  • 2
    $\begingroup$ @Markus Don't dis yourself! Personally, I think that's a great result!. (Phew.. I snuck in just in time :) ) Yes. We should go back and edit that other title. I have trouble finding that post, myself. $\endgroup$
    – Robin Betts
    Commented Jun 3, 2021 at 13:26

A little bit ashamed of this answer now that I've seen the simpler setup, but maybe someone will find it useful...

Shader solution

Strategy: snap the coordinates to the nearest hex and then apply the usual magic (some kind of animated gradient) to color / normal / displacement

Know your enemy

A regular hexagon is made of 6 equilateral triangles, which means the side is also the radius of the circumcircle. The diameter of the circumcircle is therefore 2s, and so is "the largest width" of the hexagon. The incircle's radius is also the height of the triangle or cos(30°)*R. You can find more formulas in the Hall of Hexagons.

The hexagonal tiling is also surprisingly simple, it's really brick tiling, but the bricks are deformed (the point is, the spacing is the same as in trivial brick tiling):

The algorithm

Treat the hexes as bricks. Snap to the nearest row of bricks. The height of the row of bricks is 1.5s (because that's the side s and half of the difference between that and the largest width). Now you can see on the picture below, that you actually may be a point belonging to a higher row of hexes - for example if you are in a triangle marked violet:

So you want to define two lines, the white line (vvvvv) on top of the image and the green line (^^^^^) on bottom of it, and calculate if you're below or a above the line. You choose the pattern (up-down-up... or down-up-down...) based on your "brick-row" being odd or even. Then you correct your actual row as the real hexagon row, and then you can snap to the nearest hexagon by simply using the smallest width (marked with a yellow arrow) as an increment.

Custom nodes

Hex dimensions:

Row number:

vvvv pattern:


The usual magic

You can wrap whole "setup" in a single custom node, and then just modify your coordinates with it so they are snapped to the nearest hex:

Displacement here needs this setting:

  • 5
    $\begingroup$ ... and really nice presentation, too! $\endgroup$
    – Robin Betts
    Commented Jun 3, 2021 at 13:28
  • $\begingroup$ woooooooooooooow $\endgroup$
    – Chris
    Commented Jun 8, 2021 at 5:36

You must log in to answer this question.

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