Character Creation
We figured that with the attention our character creation system has been getting lately, that it was time to write a devblog about it. There´s lots to cover, so let´s get to it!
The Carbon Character System was made to enable us to create characters for several projects, including Eve. It started off as a design document containing various wishlist features, ranging in complexity from the simple to the impossible. I believe most of the items on the list ended up being possible, with the possible exception of essentially being able to perform a striptease with arbitrary clothing. Hmm, do they even do that in CGI movies these days? Do I really want to know?
Anyway, the system has been seen in public before, highlighing cloth simulation and recently on the Singularity test server, as seen here and here. So what‘s it all about? Is there anything new here?
For this blog, which I hope is the first of several, we‘re going to take a closer look at a couple of interesting features of the system you‘ll have in your hands soon. There are lots of interesting (to me, anyway) things about the system to explore, but I‘ll start with what makes the faces tick - the specs of the faces and the face sculpting feature. My vantage point is right in the middle between programming and art - I do character tech art.
Example Eve Character.
Making Faces
Making 3D models look as good as possible can be accomplished in a number of ways, but the easiest is to simply use massive poly counts and huge textures. Getting the models created by awesome artists helps too. The Carbon Character System scales up and down easily, and if you take the time to create all the level-of-detail meshes you want, it can go from simple stick figure to massively heavy character. For character creation, we decided to do everything we could to ensure you see exactly what our artists wanted you to see, resulting in these specs:
- We use a separate base mesh for each bloodline. There are 24 of them total.
- Each head is about 4500 vertices at the highest detail level. The tearduct is a separate mesh...
- All the faces are perfectly compatible with each other - same vertex counts, models, etc.
- To allow sculpting to happen, each face has 92 morph targets, that is sets of different shapes that can be applied to the face to , for instance, lengthen the nose. In addition, the body uses 20 more, some of which are in the face as well.
- At the very highest settings, (not the default ones!) your character uses a set of textures that are 4096x2048 in size - uncompressed.
The models contain a lot of detail, and it‘s all available in-game. Note: There are no shadows in this shot to show everything clearly.
Those textures use up a massive amount of video memory, of course. But since we‘re not bounded by console-size memories and have the textures available at this size, and since they compress really well using lossless compression, we decided to go for it, and allow those with the hardware to enjoy it fully. And we‘re not going anywhere - in a few years, this really won‘t seem that much, so no harm in being prepared for the future.
Our angry trailer guy is actually using game texture resolutions.
Touching Faces
A major feature of the character system is the ability to "Sculpt" the face - pick at it, and have it react to your prodding and pulling in a way that makes sense. This, of course, needs to work on any of the faces, all of which have slightly different skeletons. This is how it came about, and is an example of how the Carbon framework can make seemingly complex systems pretty easy to make.
A peek at some of our raw blendshape data. Each row represents a zone you can "touch".
- First, I needed some morphs with various areas moving in response to picking at the face in front and side view. At first, I just moved some vertices around very roughly to create the first version of the 92 shapes mentioned above.
- Then I needed a picking mechanism, something to allow me to click the face, and have it react. It turns out that Eve ships can tell me where they've been clicked, with UV coordinates. That's very handy, since they're in the same rendering framework and the method could easily be "borrowed".
- Mouse gestures needed to mean something, and not just left-right or up-down. So I prototyped a system in Maya that allowed arbitrary field of 2D triangles to contain value combination that could be interpolated. In theory, it can interpret gestures of any kind for any purpose, but it turns out that keeping the fields simple works the best for sculpting - in effect they ended up pretty similar in behavior to the old-style face shape fields. The Maya prototype code easily ported over to the engine - a bonus of CCP using Python for everything.
- The player needed to see what's going on, something to indicate what area is being moved. So a programmer in the character team copied the character to a "ghost" scene, and made it render the character in a way similar to ship shield hardeners.
- Once this was all working, it wasn't hard to use the same system to pose the character, and here, the fields could be a bit more elaborate. They just controlled animation parameters instead of fading morphs in and out.
Example triangle field. Each vertex can contain any combination of A=x values. The actual fields in the nose ended up simpler than the prototype field on the left.
It took a couple of weeks of prototyping to make it work with placeholder data without feedback. Then a process of gradual refinement and fitting it into the rest of the system took place. For example, if you drag the bridge of the nose, what do you do with glasses? Shouldn't they move too? Yes, the solution is to make glasses inherit the morphs of the faces without distorting them. Not trivial to do, but nothing our MacGyver-esque tech artists couldn't handle.
Future Topics
There are all kinds of other items to discuss in the future. Here are some examples of things likely to crop up:
- Texture compositing - how it's done, and what you can do with it
- Morph shapes everywhere - not just used in the face
- Normals - why they're evil and will hurt you if you let them
- Cloth Sim - blowing' in the wind (or at least the in-station AC draft)
- Grievous Bodily Injury - how injuries could be authored just like clothes
- Giga-what? The terrifying life of CCP artists and their technological tormentors
CCP Ph00ze