Space Simulation in OpenGL : Spring - Fall 2023
What is this Project?
This project is a 3D space simulation, or to be more specific a gravity simulation, since I have not programmed in collisions yet, I plan to add this in the future, complete with customizable planets: which includes texture, size, mass, and spin. Built using OpenGL, GLFW, glm and for image processing: std_image.
How does it work?
I will try to keep this relatively short and just explain the foundation of OpenGL; however, it is quite complicated. It begins just like every other graphical framework with a blank screen (in OpenGL you need to create the blank screen but that’s unimportant) from here you can create shapes by using an array of coordinates: {x1,y1,z1,x2,y2,z2,x3,y3,z3}. However, these coordinates are pointless if you don't define the lines between them, so in a second array you can connect each point using their index in the array. Order matters due to face culling; this simply optimizes your code by only displaying the front faces / vertices rather than rendering all of them. Just like circuits, with face culling you can use the right-hand rule to determine the direction of the face. This also applies for 3D shapes because it is very important to pay attention to as there are more faces and dimensions to account for. Once we have all this information, we can store it in buffers, which essentially sets aside a chunk of memory in your computer for this data. Then using a vertex attribute pointer, you tell the computer how the data is stored: what data type it is, if there are any offsets, and what the stride of the data is. At this point we'd have enough to be able to draw a shape on the screen. This is a pretty watered-down explanation of the basics of OpenGL. The things I didn't explain about my project are screen-space projection, sphere generation, shape subdivision, texture unwrapping of various shapes, shading, cube mapping.
As for the physics involved in creating movement, this was my approach. For something to appear in motion its position needs to be updated every frame. So, to calculate where a planet would move in one frame, I first calculated delta time, then I iterated through each planet and calculated the summation force vector on the object from each of the other objects. To determine the amount of force from each object I had to use Newtons law of gravitation. However, having the force vector isn't enough, we still need to move the planet, so using Newtons second law, f/m=a (f=ma), I could determine the acceleration of the object. Multiplying that by delta time squared would give the change in position across that frame, then that simply gets added to the objects position from the last frame.
Recently I built my own GUI system for this project. It was my first time building my own GUI from scratch. This taught me a lot about what actually has to go into merely clicking a button as well as checking this for many different objects. Then we have to validate the input to ensure the program can understand it, once each of these steps are complete we can apply the given input to its respective output. This GUI allows the user to dynamically create planets after the simulation has started, rather than pre-defining and hard-coding each planet on run.
Future Plans?
- Optimizations: Currently runs great, could be optimized for large numbers of planets using instancing, and creating a max distance for calculating force
- Toggleable Tracers: lines that mark the path the planets took
- Increase Realism: Advanced textures (roughness, specular, displacement), clouds
- Collisions: allow planets to interact with each other
Raspberry Pi Drone : Spring 2023
What is this project?
This project is for a class I took that taught about computer hardware and machine level operations while utilizing the Raspberry Pi. Throughout the semester you work on a project that uses the Raspberry Pi. I worked with a partner to make a drone.
What can it do?
Our Pi drone named "FlyPi" can control each motor uniquely using the Speedy FPV flight controller that can be controlled from your phone using an app. At the same time, the Raspberry Pi is taking a video using the Pi Camera as well as determining its altitude using a sonar ranging sensor. All this data is being streamed to a flask server giving us live data from the drone.
Future Plans
- Replace Motor: One of the motors was faulty and needs to be replaced
- Video Stream: look into video stream, it eventually freezes when it's running on battery power
Course Registration Bot : Spring 2023
What is this project?
This project had an interesting origin. I had heard of students making an auto course registration bot and using it to easily register for all their classes. Many of my friends were having difficulty registering for classes before they filled up. So, they asked me if I could make a bot. Initially, I didn’t think so, but by the end of the day I had a basic prototype..
What can it do? / How does it work?
The course registration bot is an automatic course enroller. You enter your login info, and the course numbers you want to enroll in, and it will automatically enter those into the website, the millisecond the course registration page loads. This bot allows you to register for all your classes before many people would even realize the course registration page even loaded.
As for how it works, it utilizes a python package called Selenium. Selenium is a library that can open its own chrome browser and within it you can search the web and retrieve HTML elements. Essentially whatever you can do with the web it allows you to do with python. After you enter your login info and course numbers in the terminal and run the python file, it goes to the UVM webpage and auto signs you in. Then it refreshes the page as fast as it can until the course registration page opens. Once this happens the bot finds the elements where you enter your courses, and automatically enters them all and hits submit.
Results and Future Plans
As for its primary function it works very well. I got into all my classes without issue, and my friend who a good portion of his classes had only a few spots left also got into them all without issue. If I were to add anything, Id maybe add a UI and if I really want to get fancy I could polish it up into an app.
Unity Multiplayer : Summer 2022
What Is This Project?
This project is an exploration of multiplayer utilizing Unity as a backbone. I was originally hoping to create a game from it, but instead I got a rough idea of what goes into a lot of the games we see today.
What Can It Do?
Unity multiplayer was an exploration of how real time multiplayer works. From the main menu you have a few options, either select to create or join a server. If you want to create, you can make either a private or public server. Or you can join a server, where you can enter a code to jion privately or join any available public server. Once loaded in, you can run around and jump in the simple start area.
Future Plans
- Improve Client Physics: Clients physics run different than the hosts
- Polish Into a Game: Continue building the world and make a cool multiplayer game
Homework Planner App : Fall 2021
What Is This Project?
This project was to develop for myself a good planner app. All the apps I had used in the past were set up poorly, in my opinion. I decided to create my own app using JavaFX. I later created a similar web version with better UI at Homework Planner Website
What Can It Do?
You can enter assignments using a UI that allows you to enter the title of the assignment, a description, the due date, how long you think it will take, and the importance. I created a seperate screen displaying the assignments you need to do where you could sort them by due date and urgency. I also created a recommended sort that combines the due date and how long it will take. This would sort ones that need to get worked on first towards the top.
Future Plans?
- Improve UI: the UI is good; however, it's not as intuitive and user friendly as I'd like
- Incorporate an Account System: save assignments to your account and then you can transfer assignments across devices
Website's HTML, CSS and JS Coded Entirely By Bradon Soucy