This was a project done by 3 people to convert a basic RC Car with just a motor, servo, and battery into an Autonomous Vehicle. Some notable components that allowed for this conversion are:
To accomplish this project, I used OpenCV to filter the video feed and detect lane lines on both sides of the car. From that, I would receive two lines in which I calculated the bisector whose angle would be used to steer our car. The following video shows 3 autonomous laps using this method.
Another fun project we did was using object detection to adjust driving behavior. For the object detection I used the COCO (Common objects in context) pre-trained model in order to detect animals such as a raccoon and pedestrians. This combined with a simple form of distance estimation, I am able to program the different behaviors according to the object immediately in front of the vehicle seen in the video below. Enjoy!
During the spring of 2022, I created a path tracer for my computer graphics class. I started with a raytracer using Peter Shirley's Ray Tracing in One Weekend as a guide. After having a good foundation, I implemented a variety of upgrades and features such as direct lighting, indirect lighting with path tracing , and multiple importance sampling. Please enjoy a few samples of the results.
Like the name suggests, shadow mapping is a technique used in computer graphics to generate shadows Why shadow mapping? Firstly, shadows make things look more realistic, gives dimensions of depth, and just looks cool. In ray tracing realistic shadows are much easier to implement, rays are shot from the camera and when they intersect with objects, it is easy to detect if the object is occluded by a light source. However, given the computing time of ray tracing, how can we get shadows using a rasterizer instead? This is where shadow mapping comes in. it allows for the real time generation of shadows using a rasterizer.
First, I created a fragment shader that would color the scene based on depth values. In this case the renderings are from the camera’s Perspective. To generate final image on the right, I had to linearize the depth between two closer points (near and far) to create a nice gradient rather than the image on the left which assigns depth value based off unmodified z-coordinates in window space.
Since in this project, there is only one light source (the “sun”) which is a directional source as opposed to a point source, I used an orthographic projection for the light’s projection. Using this, I created the left image by rendering the scene with the depth shader fragment from the POV of the Light source (ie. drawing the scene in light space). After this, I combine the two passes by setting up a depth map frame buffer object and depth map, then using the first pass to generate the depth map and store that into a texture. Then passing this texture to the second rendering pass to allow for the calculation of shadows in a separate fragment shader. The right image is a result from this. Next, is to add back in the Phong shading for color. I combined the two by multiplying the shadow (which is 0 for occluded and 1 for not occluded) to the specular and diffuse parts of the Phong shading, the ambient lighting is left alone.
After adding back in the Phong shading, I get the image on the left which contains a shadow mapping artifact called shadow acne. The acne occurs on surfaces not occluded and is caused by the limited resolution of the shadow map and sampling of fragments overlapping. This makes it so that the surface is constant casting a shadow on itself. To fix this, a small bias can be added which offsets the depth of surfaces to make it slightly closer to the light when doing the shadow map comparison. Fixed image is on the right
Another artifact is aliasing, which causes the edges of shadows to be pixelated and jagged. The method I used to attempt to fix this is called Poisson Sampling. Which essentially samples the depth map multiple times in a small area around each fragment rather than only sampling the same location
Project Eucalyptus is a bullet journalling web application that aims to give users an online alternative to bullet journaling.
This project was created in a 10 week span in a collaborative effort with my peers. I programmed and helped design many aspects of the projects' frontend
(using Javascript, HTML, and css) like the side navigation bar and timespan format menu.
To experience the web app please follow the README on the github repository linked ahead - https://github.com/cse110-sp21-group19/cse110-sp21-group19
Mad Martians is a 3D, 4-player co-op tower defense game inspired by games like Orcs Must Die and Dungeon Defenders 2.
It was built from scratch by 7 people in 10 weeks
using C++, OpenGL, and a few other libraries for audio and networking. My role within this project involved working on the rendering/graphics engine where I parsed data coming from the game server
and rendered the game objects on the client. Lighting was done using Blinn-Phong Shading. I was also involved in creating physics based particle effects along with creating simple animations in the graphics shaders. This was one of the most
fun experiences I've had as a software developer and I hope you take look at our creation.
Here is a link to a development journal page where you can see reports on our team's progress (our original project name was Mars Rovers): Notion Link
Here is a livestream VOD where our group presented our game (Mad Martians starts at 47:23):
A Virtual Reality game inspired by Pokemon Snap where the player explores a natural environment and takes pictures of the surrounding wildlife to earn points. This was created
by 2 people in a 3 week period using the Unity Game Engine. Disclaimer: game uses free assets from the Unity Store
Some unique features of this game:
Odd Even Boxing is a boxing video game that is designed for patients with Parkinson’s Disease to enable a safe way to get exercise while stimulating their minds. Odd-Even Boxing has players not only exercise but have them use different forms of cognition by having users think about math problems as well as what type of punch they need to throw. Below is a video of the final results as well as a report with more details about our design process and implementation.