Tacx Trainer Software Virtual Reality

I’ve worked for a little over 3 years now on the Virtual Reality part of the Tacx Trainer Software.

The Tacx Trainer Software (TTS) is software for riding training sessions on a Tacx bicycle trainer, for amateur and professional cyclists.
The Virtual Reality (VR) lets you ride in virtual worlds; terrain, slope and wind info is send to the bicycle trainer, for a realistic riding experience.

For the most part I was the only artist. So I pretty much made every level on my own from scratch.
(That includes the level design, placement, lighting, particle systems, …, and creating almost all off the props)

Initially we started development using GameBryo, but halfway through production, we switched over to Unity3D.

Here are some screenshots from various levels:

Downhill Valley, the first level made in Unity. Most of the vegetation was painted on the terrain, rather than placed individually (unlike the Mediteranian level)

Valeggio, half of the Mediteranian/Italy level, the first level I made. Originally made in GameBryo’s Lightspeed.

Metropolitan, Originally started with a (very basic) 3th party city-pack, but only a part of the street layout and basic buildings remain, as most of the textures and UV’s are completely replaced or redone. The smaller props, like the traffic lights, and the entire park were made by me. (Allthough the park also contains a couple of standard Unity3D trees).

While the orginal male and female cyclist models aren’t made by me, I did make almost all the cyclist outfits (shirts+pants, not the glasses, helmets and shoes), and redid the UV-layout to better fit these dozens of outfits, and created the necessary maps for changing the skin and hair color (and for some outfits, the outfit colors).


I also made all the bikes (currently 3 types), which also have customisable colors.

MTB Track Race MTBb Trackb Raceb

More screenshots can be found on Flickr.

For more info on a more recent level (summer 2014), check here.
Golden Circle Level

The power of blend maps (or whatever they’re called)

First off, I don’t actually know whether it’s called a blendmap, that’s just what I call it,
what I mean is a grayscale texture that is used to dynamically blend 2 images.

in it’s simplest form, a single numerical value defines the clipping value; for each pixel of the blendmap, if the luminosity is higher than the clipping value image1 is used, otherwise it’s image2.
Most often though, I don’t want a hard cut like that, so instead I use 1 value that roughly determines how much of image1 to use (_BlendAmount), and 1 value that defines the sharpness of the transition (_EdgeSharpness).
Which looks something like this:

float blend = blendColor + (_BlendAmount * 2 – 1);
blend = saturate(blend * _EdgeSharpness – (_EdgeSharpness – 1) * 0.5f);
result = lerp(color1, color2, blend);

Now this might not seem like much, in fact it’s pretty much just an alphamap.
But it’s strenght comes from the fact that it’s great for dynamic transitions from one image to another, in time and/or space, and that’s usefull for a lot of things.
And it’s quite simple and cheap, which is also a good thing.

For example, I used this to make a snow material, that would blend in snow with the diffuse texture, based on the surface normal, using the blendmap in the snow’s alpha channel.
And for fading HUD overlays (like the Frost Effect, and blood splatter when taking damage).

Usage in games

The first time I came into contact with this technique, was when I saw the snow in Uncharted 2 (on the internet, I never actually played the game).
They seem to be using blendmaps for the transition between snow and ground/rocks. (which gave me the idea to make a snow material)

And I believe a lot of games also use blendmaps in general for transition between terrain textures, which looks a lot better than the default fading.
(Which should actually be a little more complex, as it’s not just blending 2 textures, but any number)

But the weird thing is that I can’t seem to find anything about it, I mean, actual documentation (or just even how it’s called),
but maybe that’s just cause I’m terrible at finding things on the internet.