Menu

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

Fullscreen >>>

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.

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.