Making My Models

Game art is really not one of my strong suits. I mean, don’t get me wrong – I think Hypergate looks pretty good. But first and foremost, I consider myself a programmer, not an artist.

Here’s a 3D model I built back around 6 years ago at the beginning of Hypergate’s development. (I couldn’t find the original textures.)

old-model-1

This was originally an enemy fighter.

 

Not bad, but I think my more-recent Hypergate art looks better:

ship-render

The Validor A, a new fighter in a future update.

Now, having worked previously with some truly talented game artists during my brief time in the VR industry, I know that my art skills don’t come close to theirs. But, I recognize that my improvements were only possible through lots of practice. And you can learn too.

The goal of this post is to provide a brief outline of my workflow for building and texturing 3D models for my games, including Hypergate. It’s a relatively simple, methodical approach that works for me.

Our case study will be the Validor A, the new fighter shown above that will be part of a future Hypergate Content Update. The focus here will be on high-level steps, not artistic design. This is also not a technical tutorial on modelling.

So, let’s get started.

1. Build the Model Shape

The first step – and really, the hardest – is shaping the model. Blender is my tool of choice. It’s free, has great community support, and is regularly updated.

I usually start with a cube and extrude. I’ll sub-divide a few faces and add loop cuts here and there. My approach is to first focus on the large details. My space ships tend to have big wings, gun turrets underneath, a cockpit, and a few greebles on top or below. I’ll start with the large pieces like wings and the nose to get the shape figured out. As always, I’m prepared to use Ctrl-Z as I iterate. The Mirror modifier in Blender is a great way to ensure that my design is symmetrical.

bare-model

Once the wings and nose are worked out, I’ll shape the cockpit. I’ll add greebles on the wings to aid the appearance of appropriate scale. This can be done using the Extrude command. I’ll extrude cylinders for turrets or antennae, and shape boxes into fins. Cylinders work great for rear thrusters, too.

2. Add Seams

Seams define edges where you want to cut your mesh when performing texture unwrapping. Think of it like slicing up a stuffed animal or an orange with scissors: if you wanted to paint each segment of the animal or fruit on a flat canvas, where would you cut to get the flattest and easiest-to-paint segments? The red lines in the wireframe image below show the seams.

seams-model

A rough starting guideline is that I’ll usually want to add seams on the natural sharp edges of my model. This minimizes the texture distortion and provides a bit of robustness if I’m going to use a lower-resolution texture. Of course, there are exceptions, and I always end up adding seams elsewhere as required.

3. Unwrap

Unwrapping is an iterative process. After adding seams, I make sure I’ve done it right by doing a simple unwrap and viewing the resulting UV islands.

uv-islands-model

Enabling “Stretch” for “Angles” in the right-hand Properties toolbox helps to visualize distortion.

Chances are, I may need to add a few more seams here and there and repeat the unwrap process to eliminate distortion. I miss seams accidentally on my first try all the time.

4. Adjust UV Islands

After I’ve unwrapped the model, I’ll apply a simple diffuse texture of a checkerboard with lorem ipsum text to my model. The checkerboard helps visualize scale and the text indicates direction. (Often my textures will include text like safety stickers.)

I’ll now translate, scale, and rotate the UV islands until I get the appropriate levels of detail for each component of the ship. Often I’ll group related UV islands together to make texturing easier later on.

In rare cases, I might need to go back and add more seams and do some re-unwrapping. “Pinning” UV vertices is very useful for ensuring that vertices I know to be correct won’t change during subsequent unwraps.

5. Exporting UV Layout and Texturing

My image editor of choice is GIMP. For small fighters in Hypergate, I’ll usually export a 2048×2048 image of my UV islands from Blender for texturing, although the final in-game textures end up smaller than this for reasons I’ll explain later. For larger objects like cruisers, I’ll usually export 4096×4096-sized UV layouts.

In GIMP, I start by adding a base colour layer (off-white, in the case of the Validor A). I colour individual UV islands, add some panelling, warning stripes, service panels, warning stickers, arrows, some text, vents, rivets, LEDs, and engine glow. I also add dirt and scratch layers. The “Layer Mask” feature in GIMP is a great way to add the appearance of worn-out paint or labels. This becomes the diffuse texture of the model.

uv-texture-mapping

I’ll also export emission, specular, and normal maps. These are just exported versions of the diffuse texture with the appropriate layers turned on or off, and further separately tweaked. The “Normal Map” plugin for GIMP is how I build my normal maps.

6. Applying Final Textures

By now, I’ve got diffuse, emission, specular, and normal maps for my model. In Blender, I’ll replace the original checkerboard material with a new one that uses these four textures. I’ll create four “Image Textures” in the “Texture” tab, setting their “Influences” appropriately.

7. Final Optimizations

2048×2048 is a pretty large texture size for a 10 meter fighter travelling at a couple hundred meters per second. This can eat up valuable GPU memory, takes longer to load from file, and is simply just an unnecessary level of detail. For small fighters in Hypergate, I usually export the following image textures:

  • Diffuse: 512×512 RGB PNG
  • Emission: 256×256 Greyscale PNG
  • Specular: 256×256 Greyscale PNG
  • Normal: 512×512 Greyscale PNG

This generally gives good results in terms of both level-of-detail and image sizes. Larger or slower objects are assigned larger textures to maintain good visual quality.

The model itself is exported as a Wavefront .OBJ file. I’ll export several levels of detail for each object. (The Decimate modifier is really useful here.) The small fighters typically have the following levels of detail, although it varies on the model:

  • High quality: 4,000 – 6,000 triangles
  • Medium quality: 2,000 – 4,000 triangles
  • Low quality: 1,000 – 2,000 triangles or less (I just set the Decimate modifier to the bare minimum that maintains the general model shape)

So how long does this entire process take? It depends. When I rush myself with this kind of work, it usually results in poor quality and more mistakes. A ship like the Validor A might take me about 2-3 days’ worth of full-time work, from start to finish.

I hope that this guide has been somewhat useful. Like I said, it is rather high-level. Comments are more than welcome if you have suggestions or would like more details on a particular step.

GN

July 5 — Where I’m At

It’s only been a week since my last update, but there’s been a lot of good progress. I’ll keep this quick since there’s a few other things I’d like to tackle this evening. So, here we go:

  • Voice recording is nearly, nearly done. Unfortunately, I didn’t reach my goal of having all of the recording done by the end of the weekend. A lot was done this week, but I’m still looking for an actor for the last part (Admiral Banks). All of the other parts have been recorded, though, which means that I can go ahead and build the first eight missions.
  • Improved the cockpit. I decided that even my meager art skills couldn’t excuse the poor quality of the existing design. I spent a few days building and texturing a new cockpit model, which is shown below.

shot-1

  • Improved the missile system. The new system requires players to be smarter about how they launch their missiles; launches that are made too close to a target or not facing the target enough will only result in wasted ordnance.
  • Addressed a number of outstanding bugs and gameplay issues. All minor things, but there’s nothing like a quick demonstration to a colleague to make you realize there’s a lot that needs fixing. (“oops, that shouldn’t happen”, “still gotta fix that”, “that’s boring so I’ve left it until later”, etc.)

GN

Adding the Art

My first 3D game programming experience was with a language called DarkBASIC. For those of you who know it, I don’t have to explain why my Grade 9 Comp. Sci. teacher at the time told me to drop that language like a bag of hammers. He also said to man up and start using C++. (Okay, I’m paraphrasing a bit, but he felt quite strongly on the subject. I’m grateful he did, though — moving to OpenGL was really the better option and I quickly learned why.)

DarkBASIC came with a fairly decent set of models, music, textures, and sound effects, meaning I didn’t have to make my own. Soon, however, I found myself needing resources that weren’t included. I started building my own 3D models, textures, and sounds. I enjoyed it, and took pride in my work even if it looked less than polished.

I really hate the term “programmer art”. It comes from the days long ago when programmers were also responsible for a game’s art [1]. Don’t ask me why I don’t like that term, because I’m not entirely sure: I suspect I’m just being overly defensive. Before even seeing my game, when people ask me, “Are you using programmer art?”, I think they’re making an inaccurate assumption regarding the goal of my work. Maybe it even places emphasis on the wrong aspects of gameplay. Or maybe they’re just curious and I’m being oversensitive. Of course, this is just a hobby for me. If I was really serious about my game art, I’d hire someone to do it for me. Or make some artist friends.

When showing off a video game, friends and family would ask me, “Wow, did you make that?” and I quickly learned that I hated saying things like, “Yes, except for the trees and the music and the gun and the sound effects.” Chances are that these fancy assets were the most impressive parts, and not having a game that wasn’t entirely mine was somewhat disheartening. Maybe it was a pride thing, but I wanted to develop every single byte of my game on my own. (Within reason, of course: this obviously doesn’t include things like writing my own graphics library. Imagine that. “OpenGN”.)

(I should mention that the real world isn’t like this. Everyone is expected to collaborate. Rarely is one person solely responsible for the development of an entire project. Almost no one hires a genius and stuffs him into a closet with a laptop and slides pizza under the door.)

In Gateway, I’m developing all of the graphics myself and I’m sure that it shows. The thing is, I don’t really care so much about making it look spectacularly professional. Even with programmer art, “spectacular” is within the realm of possibility. It’s how you use that art that is important. When developing Gateway, I wanted gamers to be thinking about the massive scale of the space battles and the sense of immersion. Who cares what the half-kilometer battle cruisers look like when there’s twenty of them bearing down on your space station, plus a hundred one-man fighters?

It’s important to realize that extremely low-detail game assets don’t made a game less enjoyable — we’ve all unplugged the XBox or PS4 from the TV to make room for the SNES before. The level of graphics on those games don’t make them any less fun to play. (Yes, I realize that the art was developed by professionals, and generally looks polished even if the level of detail is low.) I acknowledge the difference between low fidelity and low artistic quality, but for the same reason that one can enjoy a game with a less-than-mouth-watering graphics experience, one can enjoy a game with programmer art.

Unfortunately, I’m not a jack-of-all-trades. (Or is that “fortunately”? I’ve never understood if this was a good thing or a bad thing.) You might be able to build your own 3D models and textures, but no matter how versatile your voice and acting abilities might be, you can’t voice all of the characters in your game. Undoubtedly, you’ll require some extra people to help you out. This is actually my current dilemma: there’s not much dialogue in Gateway, but there’s enough that I require about 4-5 actors, and I have no idea where to get them from. I’ll let you know when I figure this out.

The other issue is music. Piano lessons that I’ve quit taking more than 15 years ago do not make me a composer. Recently, I’ve become interested in purchasing the rights to some royalty-free music that fits the style of the game.

Finally, the point of this post: if you really suck at art, don’t despair. There are plenty of insanely fun games whose level of detail are very low. There are also 2D and 3D resources available online, for free or for a price depending on where you go. If you want to model everything yourself but don’t have the skills, acquire them…or adjust the style of game to fit. If home-made high quality art isn’t your thing, then tone it down to something you can do reasonably well. Remember: no amount of bleeding-edge graphics can make up for poor gameplay. Some of my all-time favourite, most immersive games I’ve ever played may have been short on graphics, but were long on fun in a way that had nothing to do with art.

GN


[1] Rogers, S. (2010). Welcome, N00bs! In Level up! the guide to great video game design (p. 13). Chichester: Wiley.