Art Style - voxraygames/worldbuilding GitHub Wiki

We're going for a "modular voxel" look, or in a way "ascii art style" for voxels.

What that means is that absolutely everything is built from voxel "blocks" that are 9x9x9 voxels in size (each voxel being about 4cm, see below), and everything that is a bigger object/model is made of multiple of them, but in such a way that where-ever possible, it is modular.

We chose 9 (rather than 8) because it is easier to make good looking art in an odd number of voxels, since that gives you unique centered voxels to model with, and creates better symmetry.

Modular means that a large object/model (think a tree, part of building, piece of furniture) that is e.g. 180x180x180 voxels in size isn't just made up of 180x180x180 uniquely modelled voxels, but actually 20x20x20 blocks of 9x9x9 voxels that are reused thruout the model.

This has several consequences:

  • It is more efficient in terms of the total amount of voxels stored, though that is not even the main motivation.
  • It promotes a large amount of art re-use, and having many variants of a thing (e.g. 5 different trees can all be made from the same set of 20 tree base blocks).
  • It makes it look way more natural if the object is gradually damaged / falling apart.
  • It makes for a unique visual style. Arguably, a model made of 180x180x180 unique voxels can look "prettier" because there's more room for expressiveness of the artist, but that also has a downside: high-resolution voxel art tends to go "uncanney valley" where it competes with poly models in terms of proportions. Instead, the modular look makes everything in the world look highly consistent, embraces the "blockyness" in a cute way.

So, the modular style is something we want to emphasize and embrace as style, rather than try to "hide" it as may be a natural tendency when going for a realistic look.

Note for artists: we DO have a way to make larger than 9x9x9 voxel models out of 1 piece, and we will use these where they visually make sense, and trying to make it modular would be hard. We just want to minimize the amount of times where we have to do this, where possible.

Example from the 2d world that exemplifies this style (Terraria):

image

Notice how the tyles are relatively small (like in our game), and how many things in the scene are built from small blocks rather than trying to make them single sprites (e.g. the tree on the left could arguably be prettier if it was a single sprite, but its blocky nature does give the whole world a consistent feel, like there's nothing special about that tree: it's made from the same "materials" as everything else).

Similarly, Starbound:

image

More examples:

In 3D, a very modular, low res scene that embraces blockyness can look pretty: image

Whereas high-res, unique voxels to me look ugly, I'd much prefer polygons instead: Clipboard-1

Physical size of voxels.

Our "player eye height" is currently 4.5 blocks (which is ~40 voxels), meaning that a voxel is close to 4 cm in physical size.

For comparison, Minecraft eyeheight is 1.5 of their blocks, so our blocks are 3x smaller. A stairstep in old games like Quake 1 / Doom used to be 16 texels (out of a eye height of 56 texels), so our blocks make stair steps that feel maybe 15% smaller than the ones in those games.

Note that in first-person games (like ours), scale tends to feel different from the real world, i.e. you tend to feel larger than you are in game. So rather than trying to use real world measurements for things, use what feels right in game. Typically game scale will be bigger than real world, for example a stair step is designed to be exactly 1 block, which would be 36 cm, which would be way too big in the real world. But it feels just right in game.

Rule of thumb: things that are smaller than the player tend to have a voxel size that is bigger than they would have in real life. Also, things that are bigger than the player tend to have a voxel size that is often smaller than they would have in real life. This is effectively a non-linear "compression" of scale that works well for a 1st person game (with wide fov), and a voxel game in particular.

Tiling

Most tile-based 2D games use extensive sets of material transition tiles, which is feasible in 2D because the amount of combinations, while high, is still manageable, and authoring them is simple. In 3D, the amount of combinations would be excessive, hard to author, and use. So in line with the idea of modularity, we're going for a style of tile (block) that can fit any other block, because its detail is self-contained inside the block. The screenshot of Starbound above contains many such blocks, and has a much more "modular" look than most 2D games.

That said, for materials that are used many in a row, this will start to look repetitive. Instead of transition tiles, it is thus important that:

  • We author many variations for a particular material, and those variations should try to look fairly different from eachother. These can then be placed randomly.
    • The engine automatically provides 4 different rotations, and just using these 4 randomly already provides a lot of variation.
  • We don't just use a single material for large stretches. Dirt should have rocks and roots in them. Grass should be alternated with flowers and other vegetation. etc.
  • We can still use larger unique models (of e.g. 18x18x18) on occasion to break up the monotony of a material or model.

Block Style vs Physics and Rendering concerns.

For style reasons, it is good if each block is authored to be "mostly solid" or "empty", as this emphasizes the unique style of everything being built out of blocks. This means avoiding block designs that are "mostly empty".

But there are also efficiency and gameplay reasons to prefer such blocks:

For rendering, a block that has only one single voxel set is the most expensive possible block to render, as the raytracer can't bypass it as being an empty block, and yet it is 95% likely not going to hit anything in that block and thus the ray must continue after an expensive per-voxel traversal.

For physics, all the basic physics runs on block bounding boxes, not voxels. While we may at some point add per-voxel physics, this may not be as desirable as you think, because blocks with few voxels set in them would cause the player to unexpectedly collide with geometry they can hardly see. Having blocks that are visually "mostly solid" or "empty" also results in gameplay that is most predictable, floors that feel smooth even if they have fine voxel detail, etc etc.

In addition, when models break apart, any blocks with few solid voxels in them will look odd.

The ideal blocks thus have between 40% and 80% solid voxels. Less than 40% causes the above issues, and more than 90% means a block looks fully solid, and thus lacks geometric detail visually.

Tools

We've used MagicaVoxel so far for our base voxel blocks, but will happily add support for other voxel editors.

Making a larger model from voxel blocks is something that will typically happen using the in-game editor.

Snapping

Since the unique visual look we're going for may be hard to wrap your head around, let me go a bit deeper into the concept of what I'll call "snapping" as the essential core of our art.

Lets look at minimalistic pixel art, and how that applies to art in "blocks" for our game.

Clipboard-4 image Clipboard-3

  • Let's compare the pixel art human and the fully realistic human right next to him.
  • Now if his head is going to be 5 pixels wide, the eyes on a full realistic human may be only be 0.6 pixels wide and 0.3 pixels high.. that would normally mean the eyes would disappear since they're less than a pixel in volume, or blended with the skin. This is what an automatic resizing algorithm would do and it clearly looks horrible.
  • Instead, the artist decide eyes are a very import feature, and you decide to "snap" the eyes to the pixel grid. Same with the arm and leg width. Its this choice of snapping that distinguishes a great pixel artist (and voxel artist) from the mediocre ones.
  • Now to translate that to our block system:
  • Imagine you started with a monster design completely unconstrained, drawn on paper, concept art.
  • Now overlay a block grid on there, depending on his in-game physical size, like e.g. 10 blocks high (= 90 voxels high).
  • Now you see that the eyes are maybe not only 6x5 in voxel size (less than a block), but each overlaps the grid lines in different ways. If we'd turn the guy into voxels as-is, we'd end up with 100% unique blocks, and blocks breaking apart would look arbitrary (with bits of an eye sticking to up to 8 blocks!).
  • Now we apply "snapping", eyes are forced to 9x9 size, and they are moved either closer or further away from eachother to snap to the grid. This we do with all his bodily features.
  • This is "snapping" at 2 levels, at the block level and at the voxel level! This means we have a bit more flexibility than the pixel art guy above, since if we absolutely wanted eyes to only be 4x4 voxel in size, we could, we'd just have to design a 9x9x9 block that has some of the eye socket around it. But we still want this design still snaps to blocks. An 9 sized eye will look cooler when blowing apart though!
  • We now turn him into voxels. You can still use a lot of unique voxels, but where possible, if two blocks can be identical or rotated versions of a block somewhere else, you do so.
  • How many blocks you end up with is also a function of visual quality. Low block counts are cool, but if a monster requires 50 blocks to be really awesome we go for it. A 10 high 8 wide 5 deep monster is 400 blocks if he was unique, so 50 blocks is still a big savings from unique.
  • In fact, we can also make fully unique monsters if that's the only way the artist can make the best looking monsters, especially for smaller ones. But even if we do that, we want there to be some snapping, so that we don't end up with 2/4/8 blocks that all have part of an eye, or blocks with only a few solid voxels.
  • We want this kind of snapping to apply to everything, e.g. for a table, the legs of the table will be snapped to the grid. Imagine seeing a whole world where all art has had this snapping applied. Not only will it look unique, it is my claim that it will look more visually satisfying, because this snapping brings beauty. The consistency will bring beauty.
  • So yes, what we're doing here is unusual, but I think getting it right will pay off, in terms of the game having its own style and beauty that sets us apart from everything else. But it's harder to get the concept just right. You, as an artist, tell me if what I am saying here makes sense, or if you think it won't work for some reason :)