Scroll to explore

Hello world! 👋

I’m Michael and I come from New York. My role in this world shifts like early light—everchanging, yet cast in familiar hues: programmer, researcher, writer, teacher, or some blend of these. Most often, I’m fueled by curiosity, the courage to build something extraordinary, and a cup of matcha.

My journey

2025–Present: PhD Student in Psychology (Cognitive and Comparative Psychology) CUNY Graduate Center
2025–Present: Teaching Fellowship Queens College
2024–2025: VENLab Manager Brown University
2020–2024: BA, Computer Science and Psychology College of the Holy Cross

I have worked with

unity logo csharp logo cplusplus logo python logo lua logo sqlite logo matlab logo java logo javascript logo html5 logo css3 logo julia logo android logo androidstudio logo dotnetcore logo git logo illustrator logo photoshop logo vscode logo visualstudio logo

Previous research

Higher quality narrative results in better video gaming experience but only for higher quality graphics Psychonomic Society, 2025

Abstract: Better narrative and graphics quality can enhance the video game experience by “transporting” users into a virtual world. We created low versus high narrative quality by varying vocabulary imaginativeness, relevant details, irrelevant details, and conciseness. Texture resolution and polygon count were changed to create low versus high graphics quality. Seventy-five undergraduate participants played a text-choice-based interactive video game in an immersive desktop environment. Results show that narrative quality had a main effect on narrative experience satisfaction, narrative transportation, presence, and social presence. Graphics quality had the main effect only on visual aesthetics. A high-quality narrative resulted in a better video gaming experience than a lower-quality narrative, but only in the higher-graphics condition. Females experienced more enjoyment, visual aesthetics, and presence than males. Our findings show that improving the narrative quality more than the graphics quality of a text-choice-based interactive video game can improve users’ gaming experience, with some gender effects.

Narrative quality affects narrative satisfaction, narrative transportation, and social presence of story-driven video games Brown University CoPsy Department Retreat, 2025

Effects of narrative quality and graphics quality on virtual story-driven experience Psychonomic Society, 2024

Abstract: Virtual reality (VR) technology’s consumer usage has grown unprecedentedly. VR media creators leverage narrative-driven factors (e.g., a captivating plot) to maximize users’ engagement and enhance presence (the subjective quality of “being there” in a virtual environment) and enjoyment. These story-driven experiences can also be influenced by graphics quality. Participants played an interactive desktop VR game. Using a 2 × 2 experimental design, we measured participants’ experiences in high versus low narrative quality conditions (varying in imaginativeness of vocabulary, amount of relevant and irrelevant details, and conciseness) and high versus low graphics quality conditions (varying in texture resolution and polygon count). Preliminary results suggest interactions between narrative and graphics quality for total playtime, presence, social presence, attitude alignment, visual aesthetics, and motion sickness. Higher graphics quality enhanced users’ enjoyment, donation amount, and narrative transportation. Both manipulations affected story-driven experiences, but graphics quality had stronger effects.

A social synchrony task for evaluating differences in social connectedness NEURON, 2024

Effect of ambulatory conditions and virtual locomotion techniques on distance estimation and motion sickness of a navigated VR environment IEEE VR, 2024

Abstract: We present preliminary results from a 2 X 2 between-subjects experiment. Our two IVs were ambulatory-restrictive (i.e., without locomotion) postural conditions (sitting vs. standing), and virtual navigation techniques (steering vs. teleporting). Participants navigated a complex virtual environment comprising outdoor and indoor environments for 10 minutes. We found that teleporting may result in less online distance estimation error than steering. Motion sickness was lower while teleporting than steering and when sitting than standing. Teleporting also resulted in better system usability than steering. We discuss the results' implications for VR usability.

VR environments

The Park
The Park

A visual novel story game I created for my first independent research project. Includes fully functional game logic, cutscenes, dynamically-appearing dialogue, user choices, and animations.

unity logo csharp logo android logo
VENLab
Spatiotemporal Integration

This project tests users' spatiotemporal integration of moving avatars. The system facilitates:

  • Trial generation with varied crowd sizes and perturbation parameters.
  • Session setup and management for user-run experiments.
  • Real-time data collection of participant and object motion and eye tracking.
  • JSON progress saving and CSV data export.
  • Session recreation directly in the Unity editor.

unity logo csharp logo android logo photoshop logo
VENLab
Haptic Belt

Tests the feasibility of a vibrotactile belt for providing haptic feedback in a zero-vision environment.

  • Generates paths using all specified angle/distance pairs within a limited space.
  • Includes serial communication with an Arduino using Java helper methods.
  • Positional and rotational tracking of the subject.
  • Load trial configurations from CSV and save progress in JSON.

unity logo csharp logo android logo androidstudio logo java logo
VENLab
Mutual Avoidance

A multiplayer walking experiment in augmented reality for testing avoidance between two human subjects.

  • Multiplayer networking via Unity Netcode and Unity Transport Protocol. One user hosts on the local network and the other joins the session as a client.
  • Dynamic spawning of home and goal poles in a passthrough environment.
  • Positional and rotational tracking of subjects with synchronized data collection.
  • Audio cues signaling trial phases (start, pause, end, speed changes).
  • Load trial configurations from CSV and save progress in JSON.

unity logo csharp logo android logo
VENLab
Single Avoidance

A walking experiment for testing human avoidance of a virtual object.

  • Initializes object position and motion from an input file.
  • Positional and rotational tracking of the subject and object.
  • Load trial configurations from CSV and save progress in JSON.

unity logo csharp logo android logo

Independent projects

Maomao

A mod that introduces a new leader and civilization to the game.

lua logo sqlite logo
Receptionist

A friendly AI-powered receptionist bot for Telegram.

python logo
Website
This website!

Developed using Three.js.

javascript logo html5 logo css3 logo

Articles

During my undergraduate years at the College of the Holy Cross, I wrote for The Spire, the official student newspaper. I began as a staff writer, soon promoted to editor and then chief editor of the satire and creative writing section. My goal with every article was to make you laugh; if not laugh, smile; if not smile, wonder, I don’t know what I just read—but I’m glad I read it. I’m a changed person now.
⭐ Recommended articles

Scooby-Doo: Fair Trade or Exploitment?

Graduation Day

Netflix Announces Innovative Policy Changes

Optimizing Your Reaction Time for Enrollment

BREAKING: Congressmen Expose TikTok’s Development Failures

Gaming & Esports Club Touches Grass: An Interview With Sebastian Johns ‘23

A Deep Dive Into Upcoming Events on myHC

Holy Cross Theatre Premieres Musical Company

Report: “Can Robots Feel Pain?”

Surviving the Worcester Winter

My Resume (Royalty-Free)

The Last Spire

Unfocused Group #1: Self-Driving Cars and Microwaves

BREAKING: Joe Biden Stays in Power Following 2022 Election

My Spring 2023 Course Recommendations

Family Weekend Account From a Holy Cross Father

The Holy Cross Mission

“Theory:

President Rougeau Beats Colgate in Intense Football Match

The Dunkin’ Runner

What is Going On With Orientation?

Author’s Note

Holy Cross Sued For Sledding Tragedy

How to Have Fun in Kimball

The Case of the Disappearing Snow

Bird Poem

Campus Contemplations, Pt. 2

A Night to Remember

Campus Contemplations, Pt. 1

My Experience With That Leroy Kid

This is not just to say…

A Comprehensive Guide to the Science Complex

The Sodium Diet

Job Posting – All Students Eligible!

Student Artist Makes a Commotion, Fire Department Called

The New Equipment at the Jo

Live from Cool Beans: Milkshake Tier List

Building Snowmen On the Hill

Recorded Phone Call from 2-11-2021

They Took Away Our Campus, and Now They’re Taking Away Halloween

There is a Monster on Campus. Please Believe Me.

A Tale of a Freshman

The Hokey Pokey

I immensely dislike the Hokey Pokey.

It is, inherently, a flawed dance. In each verse, it instructs the dancer to "do the Hokey Pokey," a step that is never explicitly defined and presumably refers to the dance in and of itself. This results in a recursive loop without an end condition.

Consider the following C++ program, which attempts to implement the Hokey Pokey but will inevitably run into a stack overflow error due to infinite recursion:


    #include <iostream>
    #include <vector>
    using namespace std;

    class BodyPart {
    public:
        string type;
        string side;

        BodyPart() = default;
        BodyPart(string t, string s) : type(t), side(s) {}

        void PutIn() { cout << "You put your " << side << " " << type << " in." << endl; }
        void PutOut() { cout << "You put your " << side << " " << type << " out." << endl; }
        void ShakeAllAbout() { cout << "You shake your " << side << " " << type << " all about." << endl; }
    };

    // Initialize body parts
    BodyPart leftFoot("foot", "left");
    BodyPart rightFoot("foot", "right");
    BodyPart leftHand("hand", "left");
    BodyPart rightHand("hand", "right");
    BodyPart head("head", "");
    BodyPart wholeSelf("self", "");
    vector bodyParts = { &leftFoot, &rightFoot, &leftHand, &rightHand, &head, &wholeSelf };

    void HokeyPokey();
    void TurnYourselfAround();

    int main() {
        HokeyPokey();
    }

    void HokeyPokey() {
        for (BodyPart* part : bodyParts) {
            part->PutIn();
            part->PutOut();
            part->PutIn();
            part->ShakeAllAbout();
            HokeyPokey(); // This is where the infinite recursion occurs
            TurnYourselfAround();
        }
    }

    void TurnYourselfAround() {
        cout << "You turn yourself around." << endl;
    }