Skip to content

Extended Reality

Half-Light

VR exploration of transitional spaces in Unreal Engine 5

A VR experience exploring liminality and transitional spaces, built with Unreal Engine 5.2 using Blueprint visual scripting, OpenXR, and VRExpansionPlugin. Features a snowfall environment with interactive elements, hand tracking, ambient soundscapes, and cinematic sequences.

Half-Light cover
My role
Sole Developer
Period
Oct 2023 – Sep 2024
Platforms
PC VR
Status
delivered

Tools & technologies

Unreal EngineOpenXRVRExpansionPluginBlueprint Visual ScriptingEnhanced Input SystemNiagara Particle SystemSequencer

Impact & Results

  • Delivered a complete VR experience with seven modular Blueprint subsystems (player control, hand animation, interaction, UI, level streaming, audio, cinematics) as a solo developer
  • Implemented a custom skeletal hand animation system with six distinct poses driven by an enum state machine for natural controller-to-hand mapping
  • Designed a layered spatial audio environment with three ambient soundscapes reinforcing the liminal atmosphere
  • Achieved stable VR frame timing via forward shading, MSAA 4x, instanced stereo rendering, and baked lighting
  • Revisited the project nine months post-delivery, adding Sequencer-driven cinematic sequences with dynamic time-of-day transitions

Overview

Half-Light is a VR experience exploring liminality: the quality of ambiguity and disorientation found in transitional spaces. The player is immersed in a quiet snowfall environment where they can interact with objects, listen to layered ambient soundscapes, and watch the world shift around them through dynamic lighting and cinematic sequences. The project investigates how VR's inherently liminal quality (being physically in one space while perceptually inhabiting another) can reinforce themes of transition and in-betweenness.

Built in Unreal Engine 5.2 using an entirely Blueprint-based architecture, Half-Light was developed at Shenandoah University and later revisited with a cinematic upgrade that added Sequencer-driven time-of-day transitions to deepen the environmental storytelling.

Role Summary

  • Sole developer responsible for all aspects of the project across both versions. In the v2.0 upgrade, performed an engine upgrade and designed the Sequencer-driven cinematic system that synchronizes sun movement with narrative sequences. Continued ownership of the VR interaction architecture, hand animation system, spatial UI framework, ambient audio design, and environment assembly. Managed the full project lifecycle across multiple development branches and a post-course revision.

Non-Technical Summary

This project is a virtual reality experience that explores the feeling of being "in between," a concept called liminality. When you put on a VR headset, you find yourself in a quiet snowfall scene where you can interact with objects, listen to ambient sounds, and watch the world change around you.

In this updated version, the experience now includes cinematic sequences where the sun moves across the sky in real time, creating a sense of time passing within this transitional space. The dynamic lighting adds emotional depth to the environment, shifting the mood from one state to another as the experience progresses.

The project was originally built at Shenandoah University, then revisited and upgraded to push the environmental storytelling further through cinematic techniques.

Highlights

  • Built an immersive VR liminality experience in Unreal Engine 5.2, delivering a snowfall environment with hand tracking, spatial interactions, and dynamic cinematic sequences
  • Designed and implemented a custom hand animation system with six skeletal poses driven by an enum state machine, enabling natural VR controller-to-hand mapping
  • Engineered a Sequencer-driven cinematic system with synchronized directional light movement, creating dynamic time-of-day transitions during gameplay
  • Integrated OpenXR and VRExpansionPlugin for cross-platform VR support with instanced stereo rendering, forward shading, and MSAA 4x for stable frame timing
  • Created a layered spatial audio system with wind, fireplace, and snowfall ambient soundscapes to reinforce the liminal atmosphere

Quick Highlights

  • Dynamic sun cinematic: Sequencer-driven directional light that moves in sync with cinematic sequences
  • Blueprint-only architecture: full VR experience without any C++ code
  • Custom skeletal hand model with six animation poses driven by enum state machine
  • Niagara particle system for realistic snowfall effects
  • Spatial audio design with layered ambient soundscapes (wind, fireplace, snowfall)
  • Cross-platform VR via OpenXR with instanced stereo rendering

Technical Breakdown

Player System: The VRPlayer_BP Blueprint serves as the core player controller, managing head and hand tracking through VRExpansionPlugin's VR character framework. Controller input is handled via the Enhanced Input System with a dedicated PlayerInput_IMC Input Mapping Context mapping trigger and grip actions to interaction events.

Hand Animation: The BP_HandAnim Blueprint drives a custom skeletal hand mesh (QK_CustomHand) with physics-enabled bones. Enum_HandAnim defines six animation states: grip, open, pointing, thumbs-up, stretched, and quick-grip. The system transitions between states based on controller input, blending between pre-authored skeletal animations.

Interaction Framework: Interactable_BP provides the base class for all interactive objects using an event-driven pattern. Child Blueprints (VRButton_BP, Campfire_BP) override interaction callbacks, while Enum_ObjectType classifies objects for type-specific behavior.

Dynamic Cinematic System: The v2.0 addition uses Unreal's Sequencer to drive cinematic sequences that animate the scene's directional light. The sun movement is synchronized with the cinematic timeline, creating time-of-day transitions that shift the environment's lighting and mood during gameplay. This adds a temporal dimension to the liminal experience, reinforcing the sense of transition.

UI and Level Management: MainMenuUI_WBP handles the spatial main menu, SpawnUIElement_BP manages dynamic world-space UI, and LevelLoader_Blueprint handles streaming between MainMenu_Level and Snowfall_Level.

Rendering: Forward shading with MSAA 4x, Virtual Shadow Maps, instanced stereo rendering, and Nanite mesh management. Niagara drives the snowfall particle system (Snow_NS). Lumen is disabled in favor of baked lighting for consistent VR frame timing.

Systems Used

  • VR Player Controller: Blueprint-based VR player system with hand tracking and controller input via Enhanced Input
  • Hand Animation System: Custom skeletal hand mesh with enum-driven animation states for grip, point, open, and thumbs-up poses
  • Interaction System: Event-driven interactable base class for VR buttons, campfires, and environmental objects
  • VR UI System: Spatial UI framework with main menu widget and dynamic UI element spawning
  • Level Loading System: Blueprint-based level loader for streaming between main menu and gameplay environments
  • Ambient Audio System: Spatial audio soundscapes with wind, fireplace, and snowfall ambient layers
  • Dynamic Cinematic System: Sequencer-driven cinematic sequences with synchronized sun movement for environmental time-of-day storytelling

Deep Dive

Conceptual Foundation: The project explores liminality, the quality of ambiguity or disorientation that occurs in transitional phases. VR is an inherently liminal medium: the user is physically in one space while perceptually inhabiting another. The snowfall environment reinforces this through visual obscurity, muted audio, and a landscape that feels suspended between states. The v2.0 cinematic system adds a temporal dimension, with the sun's movement creating a sense of time passing within the liminal space.

Blueprint Architecture: The project is built entirely in Blueprint visual scripting rather than C++, chosen for rapid iteration. The modular Blueprint organization separates concerns into player control, interaction, UI, animation, audio, and cinematic subsystems. The Interactable_BP base class pattern allows new interactive object types via child Blueprints that override interaction callbacks.

Hand Tracking Implementation: The hand system uses a custom skeletal mesh (QK_CustomHand) with Enum_HandAnim driving a state machine across six animation clips. Controller input events trigger state transitions: trigger activates grip, thumbstick activates pointing. BP_HandAnim handles animation blending and applies the selected pose each frame.

Dynamic Cinematic System (v2.0): The key addition in v2.0 is a Sequencer-driven cinematic system. The directional light (sun) is keyframed within a Sequencer sequence, and its rotation is animated to simulate time-of-day progression synchronized with the cinematic timeline. This creates a visual narrative layer where the environment's lighting shifts from one state to another, reinforcing the liminal theme of transition. The cinematic plays during gameplay, blending environmental storytelling with player agency.

Environment Design: The Snowfall Level combines Polygon Adventure and Polygon Nature asset packs with custom materials and a Niagara snow particle system (Snow_NS). The environment is designed around a central campfire with surrounding structures, creating a focal point while snowfall dissolves visibility at the edges. The terrain uses multiple landscape layers for varied ground surfaces.

Audio Design: The ambient audio system layers spatial sound sources: omnidirectional wind, a fireplace crackle attached to the campfire Blueprint, and a diffuse snowfall ambient track processed with reverb. The sparse mix reinforces the liminal quality of the space.

VR Performance: The project uses forward shading for reduced overdraw, MSAA 4x for clean antialiasing, instanced stereo rendering for batched eye views, and Virtual Shadow Maps. Lumen is disabled in favor of baked lighting for consistent frame timing. Nanite handles mesh complexity management across the environment.


KEYBOARD_SHORTCUTS

GO_TO

  • g h TERMINAL
  • g p PROJECT_INDEX
  • g e EXPERIMENTS
  • g s SKILL_MATRIX
  • g a ABOUT_ME
  • g r EXPERIENCE

GLOBAL

  • ⌘K COMMAND_PALETTE
  • / COMMAND_PALETTE
  • ` TERMINAL_MODE
  • ? SHORTCUT_PANEL
  • ESC CLOSE_OVERLAY

Chords expire after 1 second. Keys are ignored while typing.