## Inspiration

We were looking for web multiplayer games for working remotely, some friends like to play Beat Saber for exercise, and some wanted to play Beat Saber but didn't have a VR headset.

## What it does

Yeet Saber is a web based multiplayer game that uses phone orientation/rotation data and websockets to enable playing Beat Saber with your phone as the controller for hitting blocks. Also, you can create and join rooms with a room ID to play the same Beat Saber song as your friends and see their scores, and upload official Beat Saber maps to play.
This would be beneficial for de-stressing and taking breaks when working remotely, and getting some stretching and exercise.

## How we built it

We obtained the device orientation using the deviceorientation event. Then, we forwarded this to our backend server.

Our backend was written in Node.js. It acts as a proxy between people's device controllers and their desktop browsers. It also allows people in rooms to see each other's scores and states. It sends controller orientation data to the desktop it was paired with.

The desktop page then uses Three.js to display 3D blocks. It also allows room hosts to upload Beat Saber maps so that everyone can play on the same map at the same time.

## Challenges we ran into

We have never used DeviceOrientationEvents before and don't have that much experience with quaternion 3D rotations, so we spent a long time figuring out what the quaternions from the phone's orientation represent in terms of the x/y/z rotation of the blocks in game. We could only get the relative orientation of the phone and not the absolute position in 3D space, so we couldn't create all Beat Saber features like obstacles.

We had to account for the fact that, for example, when you point the top of your phone to the left, there are multiple orientations which should all count as "rotating left" (screen facing up, down, toward you, away from you). Additionally, it turns out that the compass heading the DeviceOrientation events return are not consistent and drifts. Therefore, we had to make our calculations insensitive to the phone's compass heading.

Hit detection was also fairly difficult, but we solved it by computing the cross product of the current rotation vector (where the top of the phone is pointing) and the previous animation frame's rotation vector to obtain the angular velocity. We then took this velocity and computed the dot product with each block's expected angular velocity. If these 2 vectors line up, it represents a hit.

Another challenge is recording the demo since streaming and video call platforms have a lot of latency but we wanted to show the multiplayer features.

## Accomplishments that we're proud of

We got more experience with 3D rendering in Three.JS and networking with websockets. Also, we actually got some code done despite having to work remotely and with only 2 people.

## What we learned

Too many console.logs will crash Chrome
Chrome and modern browsers do a lot of things to prevent spam (such as preventing autoplay of media)

## What's next for YeetSaber

More lights and colours of blocks, just like the light effects of Beat Saber
Improved rotation detection, with possibly position tracking with the help of AR systems.
## Inspiration

We're inspired by the possibilities of augmented and virtual reality with a realistic user interface.

## What it does

The player wears a Google Cardboard, which places the user into a virtual reality world, facing a monster the enemy to battle. The user holds the PS Move controller as a light saber and swings it to fight the monster. The perspective of the user changes as they walk around, move and duck.

## How we built it

Behind the scenes, a Microsoft Kinect computes the coordinates in 3D space of the player's head and hands. The PS Move controller and the IMU of the phone provide the orientations of the camera and weapon, to be rendered with Unity. Also, the computations are distributed over several machines and platforms, connected by a C# client/server.

## Challenges we ran into

One of our goals was to use the ARToolkit to display the player's surroundings in the Google Cardboard, creating an augmented reality game. We also wanted to use OpenCV to track the top of the PS Move controller, but integration proved very difficult.

## Accomplishments that we're proud of

## What we learned

## What's next for A Kinect Awakens
## Inspiration

The world is constantly chasing after smartphones with bigger screens and smaller bezels. But why wait for costly display technology, and why get rid of old phones that work just fine? We wanted to build an app to create the effect of the big screen using the power of multiple small screens.

## What it does

InfiniScreen quickly and seamlessly links multiple smartphones to play videos across all of their screens. Breathe life into old phones by turning them into a portable TV. Make an eye-popping art piece. Display a digital sign in a way that is impossible to ignore. Or gather some friends and strangers and laugh at memes together. Creative possibilities abound.

## How we built it

Forget Bluetooth, InfiniScreen seamlessly pairs nearby phones using ultrasonic communication! Once paired, devices communicate with a Heroku-powered server written in node.js, express.js, and socket.io for control and synchronization. After the device arrangement is specified and a YouTube video is chosen on the hosting phone, the server assigns each device a region of the video to play. Left/right sound channels are mapped based on each phone's location to provide true stereo sound support. Socket-emitted messages keep the devices in sync and provide play/pause functionality.

## Challenges we ran into

We spent a lot of time trying to implement all functionality using the Bluetooth-based Nearby Connections API for Android, but ended up finding that pairing was slow and unreliable. The ultrasonic+socket.io based architecture we ended up using created a much more seamless experience but required a large rewrite. We also encountered many implementation challenges while creating the custom grid arrangement feature, and trying to figure out certain nuances of Android (file permissions, UI threads) cost us precious hours of sleep.

## Accomplishments that we're proud of

It works! It felt great to take on a rather ambitious project and complete it without sacrificing any major functionality. The effect is pretty cool, too—we originally thought the phones might fall out of sync too easily, but this didn't turn out to be the case. The larger combined screen area also emphasizes our stereo sound feature, creating a surprisingly captivating experience.

## What we learned

Bluetooth is a traitor. Mad respect for UI designers.

## What's next for InfiniScreen

Support for different device orientations, and improved support for unusual aspect ratios. Larger selection of video sources (Dailymotion, Vimeo, random MP4 urls, etc.). Seeking/skip controls instead of just play/pause.