Back to Overview

Sofaworld Characters

Tools & Techart Topics

Due to everything where people gather being cancelled lately, some of my friends (Poo-Brain) started recreating some of our favorite events online.

The events are part of the Demo scene, a place where people from all over the world gather to show off tech and graphical advances on new and old hardware (commodore 64, Atari, pc executable code in less than 64kb, etc.) The biggest event that I would go to being Revision in Saarbrucken, Germany.

The first online version of these events was Revision, a recreation of the venue represented in a game called Sofaworld. The usual beam screen being exchanged for a virtual one showing a twitch stream of the event.

Outline(a small Dutch demo party) was the next demo party most of my friends would attend. Just a month between the 2 parties for development I proposed to help with the Character customization:


Since the turnover for the new party was short and manpower to work on all features was limited we had to make quick decisions while making as much of it as possible. The Revision edition randomly picked a character for you from male and female body type so I started from there, worked from 2 base meshes, to get size variations on the male and female body type.


To simplify this even more I transferred the Female body type vertices on the male body based on UV’s to be able to blend between male and female body.


This was a huge time saver, as it would mean we only needed 1 skeleton and only 1 character to skin and add animations to. This made things easier in Unity as well as we did not have to shape characters, it could all live under one prefab. Once transferred the only thing left to do was to get the head (eyes, jaw and skull), feet, hands matched up as much as possible to remove visible bad deformation in the game. side note: transferring attributes did leave some spikes here and there, so for this I cached all vertices on the base body, and the average lengths of all connected edges, if the average was above 1.5 of the original I added all these vertices in a list and used them to average vertex positions, this gave an ok enough result.


The skeleton is derived from Mixamo The character was scaled to fit the height of the skeleton and the bones of the skeleton where rotated in such a way to fit the character. To get perfect rotation on left and right a multiply divide node with negative values was added for each mirrored bone so I only had to move and rotate the left part. To not break imported animations, the bones where not frozen so I had to rely on the prebindMatrices to get the original position back during skinning.

This way we could just download any animation (without mesh information) from Mixamo and add it to the game without retargeting, which was another time saver.

Next up was clothing, these needed to be added to blend shapes as well to make sure that it was taken into the body change mechanic. The first attempt to make this work was the wrap deformer, which was extremely slow and eventually hard-crashed Maya, so not an option. Apparently having +5000 follicles attached to the base mesh that drive joints and skinning the clothes to that is no problem and super-fast!

skin wrap

To create new meshes from that without risking vertex order being messed up I used the polyUnite node attached to a dummy mesh to unite the body with the clothes. And for each shape I needed the dummy mesh was duplicated.

unite objects

We also had a separate UV-set just for the clothing. This way we could control an alpha ramp to change the length of the sleeves and the shirt itself converting a long sleeve shirt to a crop-top. Removing the necessity of multiple pieces of clothing.

uv setup

Shout outs to Trevor who did the Unity UI setup for this and Sietske who created the clothing for the character. And of course everyone else that worked on Sofaworld