This week, I focused on editing some visual details. For example, inspired by the discussion with Nicholas, I decided that every room should have a mirror, its size and other properties being determined by data. So far, I had only included a mirror if the account in question was very subjective in its tone. However, a mirror gives a lot of character to the room, and putting something there to replace it felt a bit artificial to begin with.

I also experimented with the mirror frames. Depending on the general design of the room, the frame now has a golden, wooden or dark, metallic finish. When creating the wooden frame, I learned that MeshBasicMaterial becomes handy with textures:

let texture = new THREE.TextureLoader().load("/static/hardwood2_diffuse.jpeg");
texture.wrapS = texture.wrapT = THREE.RepeatWrapping;
let material = new THREE.MeshBasicMaterial({
  map: texture

The room now has a bit more realistic window as well. This is made by turning the back plane of the room into a box and adding three other narrow boxes to the sides and top of the empty space. The abstract sculpture in the scene is by Aiekick.

Pink room with golden mirror frame and sky

More to Come!

One interesting challenge was to vary the colors of the sky shader according to the data. After trial and error, I was able to make some changes by following the code in this discussion and making those changes in my sky.js file that otherwise was a copy of the official Three.js sky object file. I didn't achieve the color range that I wanted yet, however, this was a nice example of taking a Three.js object and tweaking it to suit one's own purposes.

It has been an intense 3 months. According to our original plan, the project should be published now as the internship would come to an end. However, we have decided to continue with the project in May as well! Though the prototype could be left as it is – it already turns Twitter data into a custom 3D visual – we thought that there is more to explore, and it's nice to give some thought to the final touches.

Nikolai and I created a Linear board for the final weeks of the project. We placed tasks that could be interesting possibilities (introducing audio, more generative shapes etc.) but are not crucial in the backlog. This left 23 tasks in the "To Do" column, ranging from mapping of sky colors to improving NLP calculations on the Python side. It will be exciting to take this further!