Choose face from a list of faces (think WoW or TES 3)
or
Create face using sliders of some sort (like TES 4)
And we've been led to believe that these are the only two ways to do it. The first option allows a player to just select a face and go without having to worry about spending too much time fiddling with dials. The downside is lack of variety. On the other hand, the second option gives almost unlimited variety, but the player must spend a long time to make a non-deformed face. If only there was another way...
Now, my idea:
Before you read about my idea, know that despite my long-winded explanation, this is INCREDIBLY EASY to code.
The player is shown two* randomly generated faces. The features of each face have underlying slider values (just like TES 4) for the various features, which are hidden from the player. All the player sees is two faces. The player is asked to pick which face he/she likes better.
Then the player is shown another two faces. Again, he picks the one he likes better.
And again, and again. For two faces at a time, we would probably need to do this at least a dozen times. For 3 faces, only 8 times. For 4 faces, 6 times.
If the player chooses between 2 options 12 times, that gives a tree of 2^12 = 4096 distinguishable possibilities. This is probably more than enough. However, the beauty of this system is that if you want twice as much refinement, you only need to choose 1 more face!
*I picked the number two for simplicity, but in reality about 3-4 at a time would be better. More than 4 and it gets too difficult for the player to choose.
How is it done?
The faces have six, in a sense. We employ a genetic algorithm where the player himself takes on the role of "natural selection". The first 2 faces shown are random. The "winning" face is allowed to "reproduce" with another face from the genetic pool, which at this point is just random faces. I will explain reproduction in a moment. For now, just assume that we can create a set of offspring that share genetic traits of the chosen face, the random face, plus some added mutations.
Second time round, the player is shown 2 random offspring selected from the larger pool of offspring that was generated last round. Again, he chooses one. This face is allowed to reproduce with another randomly chosen face from the offspring pool. A new offspring pool is created.
Rinse and repeat. Eventually, and in fact very quickly, the player will converge onto the desired face.
Details of generating offspring pools:
Suppose each face has about 10 properties, each being an integer between 1 and 100. These are things like nose size, distance between the eyes, colors, etc. An offspring is created by copying half the properties of the chosen face (randomly each each time), and the other half come from a random face chosen from the previous offspring pool. After those properties are copied, we slightly randomize all the properties. This new face becomes a member of the new offspring pool. Repeat this about 100 times to generate the next offspring pool.
And that's how the offspring pools are created.
I know this all sounds very tricky written out in english, but in code it's extremely simple.
Advantages:
- the player never needs to do more than select the best face out of a set of 2-4 faces
- by the power of exponentials, this method converges on the desired face very quickly, under most circumstances
- we still get infinite variety
Disadvantages:
- the player might not understand why he's being shown 3 faces instead of 1
- if you want huge precision in the end result, this method might be slow in producing offspring each time
- biggest potential problem: does not converge to a final face if the player changes his mind over and over