nuclear engineering
virtual education
Built in Unity. Responsible for artwork and programming.
tl;dr
This is a virtual lab for nuclear engineering undergrads. I'm responsible for the design, artwork, and scripting; I built it on Unity with visuals done in Blender, Marmoset Toolbag, and Substance Painter.
Purdue University Prof. Stylianos Chatzidakis led this project to increase access to curriculum-necessary lab equipment.
Completed late 2023
3D artwork
The lab runs on the web, optimized for low-spec devices such as Chromebooks and tablets. All 3D assets together are ~25,000 triangles rendered across 22 draw events. Download size is just under 50mb.
- Texel density is lower on obscure & unseen surfaces.
- I bake lighting directly into equipment textures (not separate lightmaps) since each appears only once.
- Dynamic parts (dials, switches, etc) have bespoke reflection cubemaps to prevent any unoccluded specular ugliness.
- Some movable objects drop soft-shadow decals to make their 3D position easier to read.
All of the equipment controls are modeled and fully functional.
programming
Built in Unity, I'm responsible for all of this project's scripting (except for the cable physics). Like the visuals, everything is optimized for low-spec devices.
signal processing & equipment simulation
Each appliance is functional and simulates all of the necessary inputs and outputs. With the help of Prof. Chatzidakis and his team, I modeled each equipment's behavior in C#.
The lab targets 100,000 data samples per second, each processed by the equipment. Being a web-assembly app, I'm practically limited to a single CPU core. Even so, low-spec devices run the simulation at full speed.
The data histogram and oscilloscope line graph displays are shaders. Some equipment will write incoming data to textures that these shaders display as a graph.
cable visuals (obi rope)
For cable physics I use Obi Rope. My Obi settings are tuned for a decent balance between visual quality and performance.
Cable mesh updates are expensive; time increases linearly with vertex count, so I use flat ribbon meshes with cylindrical normals.
Cable colors are random so that users can easily see where they lead.
The cables become semi-transparent via dithering when they may obscure important elements.
user experience
The user must not be allowed to lose draggable objects behind other objects or off screen, so I don't allow dropping objects behind UI elements, outside of the camera bounds, or while the camera is transitioning.
Camera 'frames' keep important objects in view regardless of aspect ratio (especially important since the sidebar menu is resizable and affects the size of the 3D view region).
Controls must be large enough for easy interaction, so I position frames to keep controls at sane screen-sizes. I also keep related frames and controls close together.