I worked on 3D training simulations for the Railroad industry at Heartwood for about 2 years from 2020 to 2021. I contributed to many different projects while I worked there, but my main projects were Pre-Departure Inspection, Locomotive Calendar Day Inspection, and Air Brake Simulation. These projects cover a variety of industry-standard (CFR) educational guides and their corresponding tests that help locomotive workers learn the ins and outs of heavy machinery in a safe and cost-effective way before going hands-on with the real thing. The apps are made with Unity and built for Windows, Android and iOS tablets, as well as Web with SCORM integration.
My first project was Locomotive Calendar Day Inspection, or LCDI. It teaches routines for the inspection and startup of a GP38 locomotive engine. This app had been around for a while by the time I joined the team, but was in the late stages of a large refactoring effort. After some small bugfixes and getting familiar with the project, I took on the implementation of a new camera system. The old camera system worked like a slideshow- you could only jump between a bunch of pre-determined camera angles in a specific order. There were a few important goals that had to be met for the new system:
-Give users more freedom of movement, allowing them to move around the scene in a natural way.
-Keep users guided so they don’t get lost.
-Access to tight enclosed spaces.
-Allow artists and designers to make tweaks and modifications without changing any code.

I ended up with a camera system that used spline-based movement paths for the larger open areas, and rotating inspection nodes for tight enclosed areas. Spline paths were defined in the scene using nodes and curve handles as you might expect, but also contained a variety of parameters to fine-tune the movement. The user has two degrees of movement following the path left and right along the spline or up and down above and below the spline. The path also has a forward direction defined, ensuring the user is always facing the correct direction as they move around. Inspection nodes allow 360 degrees of rotation but do not allow movement in any direction. In the above image you can see an early version of the spline system with the path constraints shown visually. This display was lovingly referred to as the ‘Fishbones’ by the team and helped the designers understand how the camera would behave without jumping in and out of play mode. The users of the app never see these constraint lines, it’s just for the dev team.
Below you can see the final system implemented in the LCDI scene. It was built to be completely modular, allowing designers to modify and drop in new camera paths as needed. The feature set of the camera system was:
-Spline paths for open walkable areas, like the train platforms.
-Spline constraint override modifiers for smaller portions of a spline that need fine-tuning.
-Inspection nodes that allow access in tight spaces, such as under the train.
-Camera focus mode for keeping the camera pointed precisely at a selected part while interacting with it.
-Buttons in world-space that allow users to transfer between different splines and nodes
-Debug visualization for all path constraints and button connections

The camera system went through small modifications and refinement in the first few months as we implemented it and figured out what did and didn’t work. Once we had the system smoothed out, we then moved it over into our other projects, including the Air Brake Sim and Pre-Departure Inspection. The same camera system is still used in Heartwood apps to this day!

The Pre-Departure Inspection app was a similar format to LCDI but for inspecting the entire length of a train with different types of cars attached, as seen to the right. This would include things like cracked wheels, unlocked doors, improperly connected trains, open valves, etc. Originally Pre-Departure was integrated into the same project as LCDI, but as part of the refactoring effort it was separated out into its own project. After LCDI I worked on fixing up the new Pre-Departure project. This ended up being one of the most challenging projects I worked on at Heartwood because the majority of the Pre-Departure code was nearly 10 years old, undocumented, and none of the original programmers were still at the company. It was a difficult process chasing bugs and figuring out how everything was put together, but over time I ended up refactoring most of the project, bringing it up to a modern standard and properly commenting the whole thing.

And finally, there was Air Brake Sim. This looked similar to Pre-Departure, in that you were inspecting the full length of connected train cars, but the goal is to properly hook up the pneumatic air brake system for a train. You do things like swapping between external and onboard air pressure sources, hooking up air hoses between cars, and finding pressure leaks. The air simulation code was built by other programmers on the team while I worked on LCDI and Pre-Departure. Once the air sim was ready, assets from Pre-Departure were moved into the Air Sim project. I worked on this asset migration and the integration of the interaction and camera systems with the new air simulation system. Here you can see an example of the camera system and interaction system at work, inspecting and setting a pneumatic valve.
Check out Heartwood to see these projects with more detailed information about the educational content and videos of the apps in action. In addition to the projects mentioned above, I did small bugfixes and handled build updates for many more Heartwood apps.