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?
Blender Stack Exchange is a question and answer site for people who use Blender to create 3D graphics, animations, or games. It only takes a minute to sign up.Sign up to join this community
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':
..which, given the Hex UV, gives us the distance from the edge of the hex.
These can be used to bump / displace a surface:
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..
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?
A little bit ashamed of this answer now that I've seen the simpler setup, but maybe someone will find it useful...
Strategy: snap the coordinates to the nearest hex and then apply the usual magic (some kind of animated gradient) to color / normal / displacement
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):
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.
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: