Hi everyone,
I’d like to share Data Ride, my BA diploma project developed at the Intermedia Department of the Academy of Fine Arts in Krakow. It is an immersive VR artwork built in TouchDesigner, where a virtual world reacts in real time to data generated while riding a stationary bike.
I chose TouchDesigner as the main environment because I wanted to build and connect most parts of the project from scratch: the VR setup, interaction logic, audiovisual systems, real-time rendering, and communication with the exhibition setup.
In this post I would like to share the final work, but also describe the technical process behind it: what worked and how different TouchDesigner techniques shaped the final artistic result.
Project Overview / Concept
Data Ride is an immersive VR experience in which the participant rides a stationary bike while moving through a virtual environment. The world reacts in real time to data generated by the body: heart rate, cadence, and power output influence the audiovisual system and change the way the environment behaves.
The project explores how movement, effort, and physical feedback can shape the perception of virtual space. Instead of treating VR as a static simulation, I wanted to build an environment that responds to the participant’s body and turns cycling data into a visible, interactive experience.
TouchDesigner System
System Architecture
From the beginning, I wanted to create the project entirely from scratch, without relying on ready-made solutions commonly found in game engines such as Unreal Engine or Godot. Instead, I used TouchDesigner as the primary development environment and built most of the project's systems myself, including interaction, world logic, data processing, and real-time audiovisual behavior.
The system is highly complex. At its current stage, the project contains over 39,623 nodes and includes multiple interconnected parts: receiving data through Open Sound Control (OSC), converting incoming values into heart rate and power measurements, custom algorithms, a system control panel, a user panel for collecting responses, the logic responsible for moving the character through the world, and the entire virtual environment, which was built from simple 3D models. The first component I developed was a dedicated application for reading data from the cycling trainer and heart rate sensor. The application then transmits this data in real time to TouchDesigner, where it becomes the foundation for the rest of the system and the project's interactive processes.
Character Movement
The character movement system is based on several point attributes that store the current state of the character. P is responsible for position, vel stores the velocity vector, speed defines the current speed, speedTarget defines the target speed, heading stores the direction of movement, steer and rotate are used for turning, while uv and slopePercent are used when working with the terrain.
The movement system works in a simple way. The player input sets the target speed, and the current speed gradually moves toward that value, allowing the character to accelerate and decelerate smoothly. Based on the current direction and speed, the vel vector is calculated and then used to update the P position in the scene.
Turning is based on changing the heading value, with slight smoothing applied to the input to create more natural and responsive steering.
The terrain is handled through a height map. The character’s position is converted into uv coordinates, which are then used to sample the height of the ground. The Y value of the character’s position is updated based on this sampled height, allowing the character to follow the surface of the terrain. Due to time constraints, the character is currently matched directly to the height map, without a full gravity system or physical falling behavior implemented yet.
The system also checks the terrain height in front of the character in order to calculate the slope of the ground. The slopePercent value can then be used to modify the speed while moving uphill or downhill. I also planned to connect the terrain slope with the resistance generated by the cycling trainer, but I was not able to implement this part within the available time.
Vehicle Path-Following System
I wanted to add cars to the route to bring the world to life. Their role was to introduce additional movement along the road.
The system is based on path sampling. Each car stores its current position along a predefined path and maintains an offset from the other cars. To calculate the driving direction, the system compares the car’s current position with a second point sampled slightly further along the path. This forward sample is used to update the car’s orientation, allowing the vehicles to smoothly follow the road and automatically turn according to its shape.
Real-time data processing
The system is driven by real-time data collected during a cycling session on a smart trainer. The main data streams are heart rate, power, and cadence, which are received in TouchDesigner through OSC and first routed through a CHOP-based processing network. After this stage, the values are organized in DAT tables and processed with DAT Execute scripts written in Python. This part of the system is responsible for reading the incoming values, calculating session data, detecting changes in the user’s effort, and preparing outputs that can influence the virtual environment. During the session, the system records basic ride statistics, including minimum, average, and maximum values for heart rate, power, and cadence. These measurements are also assigned to general intensity zones, allowing the current physical effort to become part of the logic that shapes the audiovisual behavior of the VR world.
Flow detection
I also created a custom algorithm for evaluating the rhythm and stability of the ride. It works by checking consecutive samples of heart rate, power, and cadence and comparing how much these values change over time. If the participant maintains a stable and repeatable effort for a defined period, the system recognizes this as a consistent riding rhythm and switches the VR experience into flow mode. The logic behind this mechanism, as well as the connected visual layer, was developed from my own cycling experience and from conversations with friends who ride bikes. Their descriptions of flow helped me define when this state might appear and how it could affect the behavior of the virtual environment.
Ride report
At the end of the session, the system generates a PDF report containing a summary of the ride. The report includes the key session statistics and an additional value showing the estimated amount of energy produced during the effort. To make this number easier to understand, the generated energy is converted into an approximate number of possible phone charges. I chose the phone as a reference point because it offers a simple and familiar way to imagine the scale of energy produced by the body during the ride.
Audio
The audio layer is also built inside TouchDesigner. The main sound material comes from an unplanned recording I made during a bike ride. This recording is activated when the system detects the participant’s movement. I also added a heartbeat sound whose tempo follows the participant’s current heart rate.
One element I found particularly interesting to design was the relationship between the player’s position and the position of the cars in the virtual environment. The system continuously compares these positions and uses the distance between them to control the volume of the car sound. When the participant gets closer to a car, the sound gradually fades in and becomes more present. I used this mechanism to add another layer of immersion, where distance and proximity are experienced not only visually, but also through sound.
Virtual World and Data Mapping
The virtual world is based on one of my favorite cycling routes, which I often return to because of its rhythm and the possibility of entering a flow state. I translated this route into a simplified VR environment divided into three areas: leaving the city, moving toward nature, and reaching the peripheral zones outside the center of the map.
The main relationships between the participant and the virtual world are based on real-time cycling data:
1. Heart Rate and Light Temperature
Heart rate zones are mapped to the color temperature of the light. I associate heart rate with the sensation of heat inside the body, so changes in the participant’s pulse directly affect the atmosphere of the world.
2. Power and Object Scale
Power zones influence the scale of selected buildings and one species of trees. The idea was to translate the energy generated by the body into visible growth inside the virtual environment.
3. High Effort
Based on a survey in which people described what they see and hear during intense physical effort, I introduced saturated colors, motion trails, reduced environmental sound, and a stronger heartbeat layer. These effects become more present as power and heart rate increase.
4. Flow Mode
I created a custom flow algorithm based on heart rate, power, and cadence. When stable effort is detected, the VR experience shifts into a more focused state using a vignette, directional line, and reduced environmental sound.
Exhibition
My idea for the exhibition was to design two spaces that complement each other. In the first room, I placed the project description and a set of information boards. These boards introduce the audience to the world I created, explaining the relationships within the project and where they came from. This information is supported by selected quotes from a survey conducted as part of my research. The quotes refer to the flow state and experiences connected with high-intensity effort. One of the walls in the first room is filled with LED panels displaying a fragment of the virtual environment.
The second room was divided into three zones. The central part contained the interactive installation, consisting of a city bike mounted on a trainer, a heart rate sensor, and a VR headset. The installation was extended by a reactive LED structure connected to the system, which received real-time information about speed. After completing the session, the participant could collect a printed summary of their ride from a printer located in the second zone. The final part of the exhibition was a feedback station, where the audience could share their impressions through a custom interface I designed.
The entire exhibition was built as a networked system consisting of seven interconnected devices communicating with each other in real time.
Final Thoughts
Data Ride was presented as my BA diploma exhibition at Wesoła Immersive in Kraków. The exhibition lasted for three days, and during this time participants collectively rode around 80 km inside the VR experience.
The project was developed over roughly six months. During this process, I learned a lot about building larger real-time systems in TouchDesigner, especially through working with POPs, point attributes, GPU-based geometry, GLSL shaders, and data-driven visual systems.
Thanks for reading. If you are interested in my other projects, you can find more of my work on Instagram .




















