How to Calculate the Physics in Super Smash Bros. Ultimate
Videogames can do whatever they like with their physics. They don't have to follow our so-called laws of nature. Yet there are indeed rules in every game, otherwise the motions of characters wouldn't make any sense. But what are the rules? What physics govern the motion of in-game stuff?
That's where the real game begins: finding out the in-game physics. It's just like doing real physics except it's cheaper, because you only need the game and not something like a giant particle accelerator.
For this experiment, I am going to be looking at Super Smash Bros. Ultimate on the Nintendo Switch. The goal of the game is to fight other fictional characters. But you can choose just about any of the Nintendo characters from previous games. That means you can have a battle between Pac Man and Mario.
I've done this videogame stuff before—for example, the physics of Angry Birds. Super Smash Bros. Ultimate, however, offers something extra fun. It has a training mode where you can test out two characters' different moves. The best part is that you can control a virtual camera and have it stay zoomed out. This makes it easier to collect motion data. They also included some grid lines in the background as a measurement scale. It's as if the developers created this game just for me.
Video Analysis of a Jump
I will start with a seemingly simple but important move: jumping straight up. In this case I am going to use the Captain Falcon character, for no particular reason. Screen capturing seems to be disabled for this game, so I had to record the actual TV with my phone. It seems to work out just fine though. After that, I can use video analysis (Tracker Video Analysis) to get a nice plot of the position as a function of time for Captain Falcon during his jump. This is what I get.
So, what can we get from this plot? First a quick note: I am going to assume the distance units for the grid are in meters. Why? Well, that would put the height of Captain Falcon at around 1.9 meters (around 6.2 feet), and that seems reasonable. Actually, I guess I should point out that there are three important things about jumping in any video analysis.
- The time scale (is the video running in real time or slow motion)
- The distance scale
- The vertical acceleration
If you jump on Earth (in real life), you know that time is real time (hopefully), and you know the distance scale. Once you get off the ground, there is only the gravitational force pulling you down. This means that you will have a vertical acceleration of -9.8 m/s2. It doesn't matter what your starting speed is—you will have the same vertical acceleration assuming air resistance is small and ignorable.
Now, when analyzing the motion in a video you have to make a choice. I can pick two of the above quantities (time, distance, acceleration) and then solve for the third quantity. For most videogames, I would assume that the time scale is real time and that it takes place on Earth with an acceleration of -9.8 m/s2. I could then solve for the distance scale to see how big (or small) things are.
For this game, however, I am going to use the distance scale provided. Why not? If I also assume it runs in real time, that means I can solve for the vertical acceleration. But here we see there is a problem. If the character had a constant vertical acceleration, his position-time graph would be a parabola—but it's not. Of course that never stopped me before, and it won't stop me now. In the plot above you can see a data fit to just part of the data, the part that does look parabolic. From this fitting equation, I get a vertical acceleration of -5.69 m/s2. OK, I can work with that.
Also from the position plot, it looks like Captain Falcon reaches some constant speed on the way down (but not on the way up). By fitting a linear function to this part of the data, I get a falling speed of 9.47 m/s. Some other data showed the jump was up to a height of 4.2 meters above from where he started.
What about a "double jump"? This is a classic videogame jump move, in which the character jumps a second time while in the air. Here is the position plot for something like that.
The upward motion is fairly complicated, so I will just leave that alone for now. However, we do get one really important piece of information from this jump. The character moves at a mostly constant speed on the way down. In this case, I get a speed of 10.9 m/s (which is very close to the 9.47 m/s from the previous jump).
OK, one more jump. How about a running jump? You know, where the character jumps both up and horizontally as though jumping over something. Here is the plot:
Let's go over the important parts:
- This is a plot of the motion in both the horizontal and vertical directions at the same time.
- For the horizontal motion, he was running at a speed of 14.3 m/s before the jump. During the jump his speed was 6.95 m/s.
- Yes, he SHOULD have a constant horizontal speed during the jump—at least if this was subject to real-world physics (but it's not).
- I'm not sure why his horizontal speed decreased at the beginning of the jump.
- Notice that in the vertical direction, the guy moves up and down as he runs. I just think that's cool.
- The vertical motion seems similar to the case where he jumps straight up. On the way down, he moves at a constant velocity (I get about 8.9 m/s).
- For this jump, his maximum height is still about the same as when he jumped straight up.
Modeling a Falcon Jump
I just added the "falcon" to the jump because it sounds awesome. But here is the important part of physics: You don't really understand something unless you can model it. Yes, models. Science is all about models, so let's make one. Of course I'm a big fan of numerical models in Python, so that's what I will do.
But where do you start? Start with stuff you know. Make a model of a jumping human on Earth with real gravity. That's not too hard. Here is what that looks like (with the code). Just to be clear, this is NOT the falcon jump. Click Play to run it again and the "pencil" to view and edit the code.
Now that I've got something working, I can start changing the rules. Here are the things I played with:
- Initial velocity—including a short "boost velocity at the beginning of the jump."
- The vertical acceleration. I tried values of 50, 60, 70, and 100 m/s2 (oh, and many others).
- Falling terminal velocity.
In the end, I changed things up quite a bit from my conclusions based on the video analysis. Here is the rule that I have for a jumping Captain Falcon:
- Starts with an initial constant vertical velocity (88 m/s) until Falcon reaches 2 meters.
- A slightly lower constant vertical velocity (25 m/s) until a height of 3 meters.
- After that, a vertical acceleration of -60 m/s2 with an initial velocity of 15 m/s.
- Once the Falcon starts falling down, he has a vertical velocity of -4 m/s until he gets to a height of 4 meters.
- For the rest of the way down, he has a constant vertical velocity of -10 m/s.
Yes, that seems like a crazy model, but when I run it I get the following plot (along with data from the video analysis).
Check that OUT! That's as close as I can get it. Here is the code for the graph (if you need it). But of course this isn't the end. There is never an end to real science. Just because I have a model that works for THIS jump, I still need to see if the same rules work for other jumps. I will leave the test of other jumps to you as a homework assignment.
Honestly, this is what I love about physics analysis of videogames. It's just like real science, but nowhere near as expensive.