Software Splash builds AR and VR applications – immersive experiences for training, visualization, product, and games. The technology is exciting; our job is making sure it solves a real problem and holds frame rate on the headset or phone your users actually have.
VR: Presence With a Purpose
VR earns its cost where being there matters: training on dangerous or expensive equipment safely, walking a building that is not built yet, practicing a procedure until it is second nature. We build VR training and visualization for Meta Quest, PC VR, and enterprise headsets – designed to run smoothly, because nausea is a bug, not a feature.
AR: Digital on Top of Real
AR puts information and 3D content into the real world through a phone or headset: see the furniture in your room, the machine’s maintenance overlay on the actual machine, the product before you buy. We build mobile AR and headset AR that is genuinely useful, not just a gimmick demo.
- VR training and simulation – safe, repeatable, measurable
- Mobile AR product and marketing experiences
- Industrial AR: overlays for maintenance, assembly, and guidance
- Interactive 3D visualization for products, facilities, and data
- Optimization to hold frame rate on the target hardware
For industrial training tied to real building or equipment systems, our sister practice SoftwarePile supplies the domain knowledge. Tell us the problem you want AR or VR to solve and your target hardware.
Related services
- Unity Development Services — Most AR/VR work we deliver is Unity-based: Unity development services.
- Simulation and Training Software Development — AR/VR used for training: simulation and training software development.
- 3D Visualization and Digital Twin Services — Related: 3D visualization and digital twin services.
Does This Need to Be VR?
Worth asking before anything else gets designed. VR is the right call when spatial understanding, physical procedure, or presence in a place carries the learning or the message: reaching for the correct valve in the correct order, judging clearance around equipment, standing inside a room that has not been built yet. It is a weaker fit when the content is informational, when the user needs to reference documents alongside it, or when the audience is large and dispersed and the headsets do not exist yet.
A flat screen build reaches everyone with a computer, opens from a link, and can be updated without touching hardware. We often suggest building the flat version first and adding a VR mode where it earns its place, which also gives you a fallback for the day a headset will not charge. Simulation and Training Software Development covers how that decision plays out for training programs specifically.
Comfort Is a Design Constraint
Frame timing is the foundation. A build that misses its frame budget on the target headset will make users uncomfortable and some of them sick, and no amount of art direction compensates for it. That is why headset performance work starts at the architecture stage on our projects.
Beyond frame rate the decisions are design ones: teleport and snap turn as defaults with smooth locomotion available as an option, seated and standing modes, a stable horizon, no camera movement the user did not initiate, and virtual hands that stay where the user believes their real hands are. Session length belongs in the same conversation. Build natural stopping points into a module, because a training experience that demands a long unbroken headset session will lose people for reasons that have nothing to do with the content.
Controllers or Hand Tracking?
Hand tracking is compelling in a demo and removes a real barrier for someone who has never held a controller. It also loses fingers to occlusion, degrades in poor lighting, offers no haptics, and gives no reliable confirmation that a grip actually registered. For training that involves grasping, torquing, or pressing something with force, controllers with physical buttons are usually the more reliable choice.
Where the audience is walk up public, a showroom, an exhibit, a marketing activation, hand tracking removes the problem of someone needing to hand over a controller and explain it. That is often worth the tracking compromises.
The Registration Problem in Industrial AR
An industrial AR overlay is only useful if it sits where it claims to sit. That is a tracking and anchoring problem before it is a rendering problem. Markerless tracking drifts, plane detection struggles on featureless painted walls and reflective metal, and low light degrades everything. An overlay that is visibly off the component it labels is worse than a printed diagram, because it teaches people to distrust the tool.
Fiducial markers, known geometry, or codes fixed to the equipment usually do more for reliability than a better renderer. The other practical questions are who holds the device while both hands are working, whether gloves are involved, and whether a worker looking at a screen in a live plant is acceptable to your safety team.
Headset Logistics Outlast the Build
Headsets need charging, cleaning between users, firmware updates, enrollment in device management, accounts that are not somebody’s personal login, network access that corporate IT will approve, and somewhere to be stored between sessions. If the deployment spans multiple sites, all of that multiplies.
Name an owner for this before the software exists. Deciding between managed enterprise deployment and consumer store distribution also affects how you ship updates and how quickly a fix reaches users. Platforms covers what each headset target adds on the technical side.
CAD Models Do Not Drop Into an Engine
Mechanical CAD describes solids as trimmed surfaces and analytic curves. Engines draw triangles. Every conversion tessellates that geometry, and the tessellation setting decides whether a flange reads as round or faceted, and whether an assembly arrives at 200,000 triangles or 20 million. Assemblies built for manufacturing also carry every fastener, internal component, and hidden feature, while a training scene needs the parts a person sees and touches. Stripping the rest is most of the conversion work, and it has to be done without collapsing the subassemblies that must still move, which means keeping them as separate objects with usable pivots.
A standalone headset renders two eye views at a high refresh rate on a mobile class GPU with a tile based renderer, so draw calls, overdraw, and material count usually bite before triangle count does. Materials are the other thing lost in conversion: CAD appearances are not PBR materials, and a converted part typically arrives with a flat color, no UV layout, and no map set. Anything that has to look like painted steel, a worn label, or a specific machine on your floor gets authored after the conversion, not during it.
Units and axis conventions cause more bad imports than corrupt files. Unity is Y up and treats one unit as one meter by default. Unreal is Z up and its default unit is one centimeter. Revit, IFC, and most mechanical CAD are Z up. A model that arrives on its side, or 100 times too large, is almost always this and not a broken export.
Georeferenced site data adds a second problem. A model exported in survey coordinates can sit tens or hundreds of thousands of meters from the world origin, and engine positions are 32 bit floats carrying roughly seven significant digits. At 100,000 meters out, the gap between representable values is on the order of a centimeter, so vertices jitter, shadows crawl, and coplanar surfaces z-fight, and it gets worse the further out the geometry sits. The fix is rebasing the model near the origin and keeping the real world offset as data rather than as position. None of that can be scoped from a screenshot, so this is what has to come from your side first:
- Native CAD or a STEP export for machinery, or the Revit or IFC model for a building. A PDF drawing set or a rendered image is not a starting point for conversion.
- Which subassemblies have to move, open, or come apart, since only those need to survive conversion as separate objects.
- Real dimensions, or one known reference measurement, if the source geometry is not already dimensionally accurate.
- Photographs of the installed equipment, including what the model leaves out: guards, conduit, labels, signage, and wear.
- The part names and numbers the people doing the work actually use, which are often not the names in the engineering model.
What Measurable Has to Mean Before It Is Built
Measurable is a data schema decision, not a reporting feature added at the end. Something has to define what an attempt is, when it opens and closes, what counts as a step, what separates an error from a recoverable deviation, and what a passing attempt looks like. The useful events are specific: step entered, step completed, wrong tool selected, sequence violated, time in step, hint requested, attempt abandoned. Where that is not decided up front, the build ends up recording completion and a duration, and nothing anyone can act on.
On the integration side, the application posts statements to a Learning Record Store over HTTPS, and cmi5 defines how an LMS launches the activity and reconciles it afterward. That means you supply an LRS endpoint with credentials and a learner identification scheme. Identity is the awkward part on shared hardware, because a headset is a device and not a person: the working approaches are a code entered at the start of a session, a badge scan, or a session launched from a facilitator's device that already knows who is wearing it.
Correctness itself comes from a subject matter expert, and that person's availability is the schedule dependency most often underestimated. It is not a review pass at the end, it is source material. Real procedures usually have more than one acceptable order, and deciding which deviations are wrong rather than merely unusual is a judgment somebody in your organization has to make and stand behind, because the software will enforce it identically every time.
Device Support Decides Feature Scope
Mobile AR capability is per device, not per operating system version. ARCore runs only on Google's certified device list, and within that list the features are tiered: depth based occlusion, image and object tracking, body tracking, and geospatial anchoring each depend on the specific hardware, and geospatial anchoring additionally depends on Street View coverage at the location. On iOS, several ARKit features require an A12 chip or newer, and scene meshing depends on a LiDAR sensor that only some models carry. Designing around occlusion or a mesh of the room and then meeting the actual fleet is the standard way a scope changes late.
The no install path is WebXR, which gives immersive sessions in a browser on Android and on several headsets and removes application distribution entirely. What it costs is tighter performance limits, smaller asset budgets, and no vendor specific features. Immersive AR in Safari on iOS has lagged Android, so a link based AR experience on iPhone usually ends up as a USDZ model in AR Quick Look, which is a viewer rather than an application. Anything using the camera or an XR session on the web has to be served over HTTPS. The native equivalent of that gate on iOS is the camera usage description string in Info.plist: if it is missing, the app terminates the instant it requests the camera instead of showing a permission denial, which looks like a crash and gets debugged as one.
Headsets have their own limit worth knowing early. Passthrough is composited by the system, and access to raw camera frames is restricted at the platform level, so computer vision work that is routine on a phone may simply not be available to your application on a headset.
Signing, Accounts, and the Update Path
The developer accounts and signing keys should be in your organization's name from the first build, because they are difficult to move later. An Android application is identified by its package name and its signing key: a build signed with a different key cannot update an installed app, and changing the package name, or the bundle identifier on iOS, produces a new application rather than an update, so existing installs stay where they are and every device reinstalls. Organizational enrollment in the Apple Developer Program also requires a D-U-N-S number for the legal entity, and that registration is a paperwork step with its own lead time. It is a common reason a first build cannot be installed on the day it is ready.
Platform review is the specific mechanism behind the distribution difference: a public store update is queued for review before it reaches anyone, while a build delivered to enrolled devices through device management goes out when you push it. On iOS the private routes are TestFlight for testing and a custom app distributed through Apple Business Manager. Moving an already deployed fleet from consumer accounts to managed enrollment is not a settings change either, because on several platforms enrollment only happens during device setup, which means factory resetting devices that already have users and content on them.
Push a build to one real device, through the route you actually intend to use, while the scene is still gray boxes. Enrollment failures, account type mismatches, blocked domains, and provisioning problems are not fixed in code, and they surface at the worst possible moment when the first install attempt is also the delivery.
The Room, the Battery, and the Throughput
Inside out tracking needs something to look at. It locks onto texture and edges in the surrounding environment, so it degrades in dim rooms, against blank painted walls, and in spaces dominated by mirrors, glass, or large moving machinery. Roomscale movement also needs a genuinely cleared area, with the boundary set where a user at full arm extension holding a controller still cannot reach anything hard. Where the available space does not support that, a seated or standing design is the honest answer rather than a boundary people walk through.
Fit decides how the build is judged before the content does. Headsets have a limited interpupillary distance adjustment range, and users outside it get a soft or doubled image that they will report as bad software. Glasses wearers need either a spacer or prescription lens inserts, and inserts are per person and ordered against a prescription. Facial interfaces used by more than one person want wipeable covers rather than fabric.
Throughput is arithmetic worth doing before hardware is bought. Active runtime on a standalone headset is a couple of hours, not a working day, so a session schedule is really a battery schedule: how many devices, how long a module runs, how long between groups, and whether devices charge between sessions or run tethered to a power bank. Take module length, add fitting and instructions per user, then divide the group size by the number of headsets. If that arithmetic says one group consumes the entire day, it is a device count and scheduling problem to settle before the build, not after it.
Frequently Asked Questions
How is this different from a 360 video walkthrough?
A 360 video is recorded footage played back around a fixed viewpoint. The user can look anywhere but cannot move within the scene or act on anything in it, and branching to another clip is the only interactivity available. A real time build renders the scene as the user moves through it, so objects can be picked up, operated, and put back wrong. Video is much cheaper where the goal is orientation or familiarization with a place, and it stops being sufficient the moment the requirement is practicing a procedure rather than watching one.
Do you build the 3D content, or do we supply it?
Both happen, and the difference in effort between them is large. Converting and optimizing a model you already own is a bounded job with a known input. Building a machine or a facility from photographs and tape measurements because no usable model exists is a substantially larger piece of work than the conversion itself. Before assuming nothing exists, it is worth asking the equipment vendor or the original design consultant, since a usable model often exists somewhere outside the department that wants the application.
Will it run on the phones and tablets we already have?
Send the exact model numbers and OS versions before scope is fixed, because AR capability is per device and cannot be inferred from the Android or iOS version. Ruggedized handhelds and industrial tablets are the recurring problem: many run a current Android release but were never submitted for certification, and a locked down device image may omit the Google Play Services for AR component that AR features load at runtime. If the fleet cannot carry the feature set, the options are a narrower feature set, a subset of devices reserved for AR use, or new hardware.
Does a headset build need a network connection to work?
Not necessarily. A standalone headset build can run fully offline, holding results locally and syncing them the next time it reaches a network, which is often the right design for a plant floor or a site trailer. What needs planning is how the headset joins the network at all: enterprise Wi-Fi using 802.1X certificates requires the certificate to be pushed through device management, and a captive portal login page is awkward or impossible to complete in a headset browser. Anything that talks to your systems also needs the destination hosts permitted through outbound filtering.
Can the results feed our LMS?
Usually, though the format depends on what your platform accepts. Where an LMS takes SCORM packages only, the workable arrangement is a small SCORM launcher that reports launch and completion to the LMS, with the step level detail kept in a separate store, because SCORM was never designed to carry per action records. Confirm what your platform supports before the reporting design is fixed, since the two paths produce different data.
Does OpenXR mean it will run on any headset?
No. OpenXR standardizes the core runtime interface for input, tracking, and rendering, so a build targeting it is portable across compliant runtimes without a rewrite, and that part is real. Features beyond that core arrive as vendor extensions, and hand tracking detail, passthrough, eye and face tracking, and spatial anchors differ by vendor, so code using them does not carry over unchanged. Engine and plugin versions are the other constraint, because XR plugin support is pinned to particular engine versions and a mid project engine upgrade can break a device target that was working.