🕯️ Project Story – House of Arkanum
🎃 Why I Decided to Build a 3D Horror Game
The goal was to see how far I could push the boundaries of immersive, atmospheric storytelling within a browser. I didn’t want to create a traditional web app or a simple utility; I wanted to challenge myself to build an experience that was creatively, emotionally, and technically demanding.
I realized that psychological horror naturally invites mystery, tension, and depth. I set a specific objective: create a fully interactive 3D horror experience that lives entirely on the web, utilizing Three.js and React Three Fiber as my primary development tools.
The result was House of Arkanum, a project that blends environmental horror with a narrative exploration of memory decay.
🛠️ How I Developed the Concept
The experience was designed to unfold across multiple rooms, with each one acting as a functional metaphor for a different failure of the human mind:
- Looping intrusive thoughts
- False memories
- Missing information
- Corrupted data
- Reconstruction of a lost identity
From this foundation, the mechanics followed a symbolic logic: a ghost representing a loop, a candle puzzle for false memories, and a "404 room" for missing data. The narrative twist emerged naturally from these themes: the player believes they are a father trying to remember a son, only to realize they are actually the son attempting to reconstruct their father’s fading mind from the inside.
🏗️ Technical Development & Architecture
Building a multi-room 3D environment required a modular approach to handle performance and state management:
- Environmental Design: I prototyped rooms focusing on specific interaction triggers, such as ghost vulnerability within light radii and WASD movement with pointer lock for first-person immersion.
- Asset Management: I managed scene hierarchies and inspected GLB models to ensure that the low-poly aesthetic remained consistent across the project.
- Performance Optimization: To maintain a 60fps target, I implemented lightweight shaders and moody, localized lighting that minimized the overhead on the WebGL renderer.
- Interaction Logic: I developed a "snap-to-socket" system for the final workshop, allowing for the mechanical assembly of 3D models based on specific player triggers.
🏚️ The Experience Inside the House of Arkanum
Each room represents a specific memory failure disguised as a supernatural puzzle:
- Room 1 (The Loop): A ghost that can only be harmed within a circle of light, representing repetitive intrusive memories.
- Room 2 (The Null Candle Library): A puzzle involving identifying one "true" candle among illusions, symbolizing the struggle to find truth in false memories.
- Room 3 (Room 404): A vertical parallax-scrolling scene that reveals glimpses of a life that never occurred.
- Room 4 (Memory Leak Chamber): A sequence of corruption repairs representing damaged cognition.
- Room 6 (The Mirror Workshop): The climax of the game. In a dark room, the player must locate and attach missing limbs to an animatronic body. When the face is finally attached, the truth is revealed: the player is the son putting his father back together one last time.
🎓 What I Learned
Through this project, I deepened my expertise in building multi-room environments in Three.js and optimizing WebGL scenes for production. I learned how to balance technical performance with atmosphere and how to design mechanics that serve a narrative misdirection.
Most importantly, I learned the impact of environmental storytelling—how minimal dialogue and symbolic mechanics can deliver a significant emotional weight.
💀 Final Reflection
House of Arkanum is a psychological horror experience centered on memory loss and the bond between parent and child. Every room is a metaphor, and the final twist reframes the player's entire understanding of their role.
The father wasn’t rebuilding a fake son. The son was rebuilding a fading father.
This truth is the heart of Arkanum.
Would you like me to condense this into a shorter "Technical Highlights" section for your resume?
Log in or sign up for Devpost to join the conversation.