What if you could walk around my maker portfolio? :)
Written by Christopher Holley
What you see when you spawn in
This is a 3D environment based on the photogrammetry done for the MIT FlightGoggles sim (see this paper) but with my portfolio projects inside (and playable on the web!). You can learn about different projects I've done, or just wander around and explore (I could read the chalkboards/posters all day). The game is at the bottom of the page, but to make the bad (30s) loading time feel faster, here are some facts about its creation!
When I toured the MIT AERA (Autonomy and Embedded Robotics Accelerated) lab, I asked them about their simulation setup. That's where I learned about FlightGoggles, and their photorealistic 3D scan of the Stata Center. Later that day I thought that it would be really cool/funny if I could put my projects in there as an interactive portfolio. It's quite fitting that it's the Stata Center too, as that's probably the building where I would spend the most time - so maybe one day I actually will have a project on the wall :).
Disclaimer: I have never used Unity or done any 3D gamedev before this, so if I did something unidiomatic/bad... oops
It could have been easy! (It never is though.) The docs here say that you should be able to download "The Stata Center environment asset
bundle" but yeah, not there. Instead I poked around and managed to find a
data.unity3d file of the compiled game.
I can't seem to find this file again (the project website is also down at flightgoggles.mit.edu), but I'm pretty sure I got it from a GitHub release. Browser history confirms that I did download it from here. Even though it was public, if for whatever reason people at MIT want it taken down, just email me at [email protected] and I will.
I needed to go from .unity3d back to a Unity project so I could publish for the web.
My first thought was to try UnityPy,
a Python library that supposedly can extract assets. It ended up being super slow on the 9GB file and I realized I needed more than just the assets.
AssetRipper was great for this,
especially since the project is quite old (~2019-2020). I extracted the project and then had a terrible
time opening it with Unity 2019. Ubuntu 24.04 doesn't have libgconf-2-4 in the package repos.
Then I went to Windows 10 where I could not get it to detect my personal license. Finally got it open
on my laptop on 22.04 (only to a few hours later migrate the project to Unity 2025...).
There were multiple assets like Table.asset and table.asset, and Unity 2019
didn't handle this properly and would get stuck in a loop. Unity 2019.3.0f5 is right before
this gets fixed.
I wrote a simple script to delete duplicates, so if you look around enough you can find a table with no texture.
I eventually tried to open the project with a modern version of Unity (6000.2.6f1) and thankfully everything seemed to still work. It was also helpful because I could actually find relevant guides/troubleshooting info vs. a 6-year-old Unity.
There are a lot of tradeoffs between build size/game performance/detail. Initial loading time was less of a priority for me compared to texture quality. I wanted to make sure all the walls were readable because that's the most fun part.
However, the initial web build had a .data.unityweb file that was 2.2GB compressed,
which of course runs out of memory on every browser (max limit is 2GB). The textures2d folder by itself is
~9GB uncompressed. I have gotten a LOT of OOM (out of memory) crashes on web trying to balance texture quality
while staying under the 2GB limit. A lot of the images are not as crisp as I would like but given the constraints you can still tell what's going on.
(I also should not put 100MB 4K images in the build.)
For loading project images/descriptions, I went through a few different iterations. I started out
by just loading all the directories under projects/ using file operations, but then
I realized on the web you don't have a filesystem (or at least not one that works the same way).
Next I tried using StreamingAssets, which allow you to load files at runtime. On the web though this is over a network request (e.g Application.streamingAssetsPath returns something like http://localhost:8000/unity_webgl_build/StreamingAssets/). However this was not great because all of the images are known at build time, and waiting for all the network requests makes the startup feel slower even though the game was "loaded". I eventually landed on using Unity's ScriptableObjects and the Resources folder so all the images and json for projects are included in the build.
As always with infinite time you can make everything better. The perfomance is not ideal: some stuttering might occur and the load times/bundle size is not great (~400MB with gzip, maybe like 380 with brotli). There isn't anything in the way of physics so you can just walk through walls. On some browsers that only allow 1GB of memory or have some weird quirk you might OOM (all the instances I know about were fixed though). I tested on Firefox and Chrome. You also may see some "error" about cursor lock, see the demo video for an example. I am not totally sure why that happens, but just clicking on the game seems to work. UI takes so much time to make well... I went with the most functional approach I could, but you'll have to excuse the rather lame font and possible layout issues. I wanted to have our 2024 MiniFRC robot follow you around once you clicked on its poster, but the asset was too large and I never got it working. It also would have been fun to have easter eggs around that are more subtle than having a big red exclamation point (in/around the police car would be cool). Either way I am very proud and happy with how it turned out. It was super fun making this and I can't imagine a way I would rather present my projects.
If the game isn't loaded or is not working, try the following:
Make sure you have enough screen space to display it (i.e having the tab as a small window won't look right), it was built for 1440x900 and can be fullscreened with F11 or the blue button in the bottom rightAnd with all that, (hopefully) everything is loaded and ready to play. Have fun :)