M: How does bunny hopping work in video games and in reality? Because recently I think I heard in passing that, like, kangaroo hops are actually very efficient partly because as you start going faster, you actually need less energy to keep going, or if you keep using the same energy, you're going to keep accelerating or something like that. Now, I've never really gotten into it even in video games, as far as I can tell, but I'm not really sure what it actually even is, which is why I'm asking about both versions.
G: The funny thing is that "bunny hopping" in games and hopping in real life are related by name more than by mechanics.
You heard something real.
As a kangaroo goes faster, the energy cost per distance traveled doesn't rise the way it does for most animals. That's because kangaroos store energy in their tendons like giant biological springs.
Imagine a pogo stick:
At low speeds, a kangaroo is actually somewhat inefficient.
At higher speeds, more of the work is recycled from the previous hop, so the animal doesn't have to burn proportionally more energy. It isn't getting free acceleration forever, but it can travel faster without a matching increase in metabolic cost.
Humans do a smaller version of this when running. Your Achilles tendon stores and returns energy every stride. That's one reason running can sometimes feel easier than trying to walk extremely fast.
A simplified spring model looks like:
genui{"math_block_widget_always_prefetch_v2":{"content":"E=\frac{1}{2}kx^2"}}
where the stretched tendon stores elastic energy, then gives much of it back on the next hop.
So in reality:
This is almost completely different.
The term comes from players repeatedly jumping while moving, looking somewhat like a rabbit.
The famous version comes from games derived from the old Quake engine, especially:
The weirdness arose because of how movement physics were coded.
You'd think:
The physics often worked something like:
The result:
The classic technique is called air strafing:
Done correctly, each jump adds speed instead of merely maintaining it.
It's basically an unintended consequence of the math.
The engine often limits acceleration in the direction you're facing, but not total speed in every direction combined.
Imagine you're already moving north at 10 mph.
The game says:
"Okay, I'll allow another 2 mph east."
Now your velocity isn't 12 mph.
It's the vector sum:
which is about 10.2 mph overall.
Do that hundreds of times and speed creeps upward.
The simplified velocity relation is:
genui{"math_block_widget_always_prefetch_v2":{"content":"v=\sqrt{v_x^2+v_y^2}"}}
The programmers were often thinking about acceleration direction-by-direction, while players figured out how to exploit the total vector speed.
Because friction usually happens on the ground.
When you're airborne:
So bunny hopping is less about the jump itself and more about spending as little time touching the ground as possible.
There is one philosophical similarity between real kangaroos and game bunny hopping.
Both exploit a system that conserves momentum unusually well.
In both cases, the hopper is getting more mileage out of each bounce than you'd intuitively expect.
The difference is that kangaroos are using millions of years of evolution, while bunny hopping is mostly players discovering that a programmer forgot to close a loophole.
M: And that makes sense in the game, because if you were to just lose all momentum when you hit the ground, you would, well, lose all momentum. It would feel very, very strange. So there has to be some sort of slowdown period, however brief, in order to avoid just sticking the landing, assuming that whatever you're doing isn't moving fast enough to somehow kill you. I know that a lot of games used velocity in terms of falling from a particular height to involve damage. Were there or are there anywhere that kind of bunny hopping is actually potentially perilous, because if you do it well enough, it measures velocity at a point where you start taking damage or even exploding? So if you move too fast, you can literally hop yourself to death? Check online, please.
G: Yes. In fact, there are several categories of games where movement exploits and damage systems start interacting in funny ways.
The short answer is:
Bunny hopping itself usually won't kill you. Bunny hopping plus fall damage, collision damage, or physics glitches absolutely can.
A few examples:
In classic entity["video_game","Quake","1996 first-person shooter"] movement physics, expert players could accumulate enormous speeds through strafe-jumping and bunny hopping. The games still tracked velocity and fall damage separately, so if you launched yourself off a ledge while carrying all that horizontal speed, you could easily die from the resulting impact. The entire trick-jumping scene around mods like DeFRaG includes movement techniques where managing impact damage becomes part of the challenge. citeturn0search6turn0search19turn0search12
Early versions of games derived from the Quake movement model allowed skilled players to reach speeds well above intended running speed through bunny hopping. The movement exploit itself generally wasn't what killed you, but the moment you converted that speed into a bad landing, a wall impact, or a fall, the normal damage systems took over. citeturn0search12turn0search6
One of the closest examples to "hop yourself to death" is actually the old entity["video_game","Starsiege: Tribes","1998 shooter"] skiing mechanic. Players would chain terrain interactions to reach ridiculous velocities. At sufficiently bad angles, converting that speed into a collision could instantly kill you. The movement system became a balancing act between gaining speed and surviving the landing.
Games like entity["video_game","Garry's Mod","physics sandbox"] or heavily-modded Source games can produce the most dramatic examples. Once velocity escapes intended limits, collision damage calculations may start treating you like a high-speed projectile. Players can literally explode, gib, or instantly die because the game decides they struck a wall at lethal speed.
Old physics engines occasionally had bugs where velocity values became absurdly large. A player would:
and instantly die because the engine calculated an impact that was effectively equivalent to crashing a fighter jet into concrete.
There are speedrun videos full of examples where movement exploits eventually become self-destructive because the game's damage model was never intended to see those numbers.
The interesting physics-design problem is exactly what you noticed: the game must preserve momentum when you land or movement feels terrible. But the more faithfully momentum is preserved, the more likely players are to discover ways to accumulate speed. Once accumulated speed exists, every other system—fall damage, collision damage, knockback, ragdolls, even network prediction—starts getting fed values the designers never expected. That's why so many movement-heavy games end up with a kind of unofficial rule:
If the players discover a way to move 3× faster than intended, eventually they will discover a way to die 10× faster than intended.
Quake's community largely embraced that outcome rather than fixing it. That's one reason those games developed entire subcultures dedicated to movement techniques rather than merely shooting. citeturn0search19turn0search6turn0search12
M: I'm kind of surprised that it took a wall impact in order to cause damage. Was it because certain things were tracked while others weren't, or was it some sort of, like, hard-coded normal, by which I mean vector normal, velocity check, or what, that allowed people to move ridiculously fast along the floor but hit walls like they were, well, floors? I think the reason why I'm asking is I'm kind of surprised that there weren't as many absolute issues and that they went directly from purely vertical fall distance to that kind of normal checking in terms of velocity and impact. I would think there'd be at least one major example of absolute velocity plus surface contact of any kind creating a kind of sonic boom splatter that would, in some form or other, look kind of like in Back to the Future where at a certain point you transition from clipping along to no longer existing.
G: Your intuition is actually pretty good here. The reason it didn't happen more often is mostly historical and architectural rather than intentional design.
Many older FPS engines didn't really have a unified concept of "kinetic energy" or even "impact force." They had several separate systems:
Those systems often barely talked to each other.
A lot of games essentially asked:
"How fast are you moving downward?"
rather than
"How hard did you hit something?"
So fall damage might be based almost entirely on vertical velocity:
That sounds absurd from a physics standpoint, but it was computationally cheap and predictable.
A common simplification was:
The wall was treated as a navigation problem, not a combat problem.
You can think of it as:
"The player has encountered an obstacle."
rather than
"The player has experienced a high-energy impact."
Those are very different interpretations of the same event.
Players expect gravity to hurt.
Even the earliest shooters needed:
So programmers added a dedicated fall-damage routine.
Often it looked conceptually like:
if vertical_speed > threshold:
apply_damage()
not
if impact_energy > threshold:
apply_damage()
The first is much easier.
The movement system was trying to preserve momentum.
The collision system was trying to prevent walking through walls.
The fall-damage system was trying to punish big drops.
Nobody sat down and said:
"What if somebody reaches 1,200 units per second while continuously jumping?"
Because nobody expected that to happen.
Then players did.
Once physics engines became more sophisticated, your imagined scenario started showing up.
Games using more complete rigid-body physics sometimes calculate collision damage from relative velocity.
At that point:
This is especially common with vehicles.
For example, in racing games and vehicle simulators, the engine is often much closer to:
Impact severity ∝ relative velocity.
So a head-on crash at 150 mph can instantly destroy the vehicle.
Another subtle reason:
The player character wasn't really a physical object.
It was often closer to a mathematical capsule that:
It wasn't a fully simulated body with mass, momentum transfer, deformation, and impact forces.
Modern players sometimes assume old FPS engines worked like today's physics engines.
In reality, a lot of them were glorified movement calculators.
The player's velocity could be enormous because velocity was mostly a movement variable, not a stored quantity that every other system interpreted physically.
A good way to think about it is this:
In a modern physics simulation, "moving at 200 mph" is a physical fact that affects everything.
In many 1990s shooters, "moving at 200 mph" was just a number the movement code happened to be carrying around.
The fall-damage code only cared how fast you were moving downward, and the wall only cared whether you were inside it. So you could end up rocketing across the map at ridiculous speed without the game ever asking the obvious real-world question:
"Shouldn't that have killed you?"
M: I think we're talking past each other because I'm not talking about actually running into the walls. The reason I mentioned Back to the Future is that I'm surprised that there weren't any major engine issues where collision with any surface, including the floor you were jumping off of, I'm surprised that there wasn't any that took a shortcut which would simply measure velocity at time of contact and decide whether you're moving too fast to live or not, because it sounds like even with the Quake engine that they, you know, they didn't make things perfect because bunny hopping still existed, but that they managed to incorporate that kind of normalization that would let someone skip along a surface until they came in contact from a, I guess that would be a normalized version of velocity that would carry over into impact speed. Either that or they measured in terms of angle of impact first to decide whether or not the person would kind of skip or bounce off of a surface or splat against it. But my point was that I could easily envision a transitionary period where in order to coax a little bit more speed out of the older computers, instead of trying to add that calculation every time someone hit the ground in those early efforts to make something more 3D, that instead they would just say, if you touch a surface and you are traveling, you know, 1200 units of speed, you are going to be obliterated and it doesn't matter what angle of impact you came in at. And again, that's why I use the Back to the Future metaphor, because, you know, it's going fast and then faster and then suddenly it's not there. I'm surprised that there's no engine that kind of had that effect where once you got past 88 units per minute, you would just suddenly be thought of as having done the equivalent of hit the ground at full speed and explode, even if it didn't look like there was any kind of impact that would be analogous to reality.
G: Ah, yes. Now I see the distinction you're making.
You're not asking why wall impacts didn't kill people.
You're asking why there weren't more engines where the floor itself became a death trigger once your absolute velocity exceeded some threshold, regardless of direction.
Essentially:
"Why didn't bunny hopping eventually reach a speed where the instant your foot touched the ground the engine declared you dead?"
And the answer is: there actually were engines and mods that got surprisingly close to that, but most mainstream FPS engines accidentally avoided it because of how they were structured.
The key is that most movement engines separated velocity into components.
When you landed, they didn't ask:
"How fast is the player moving?"
They asked something closer to:
"How fast is the player moving toward the ground?"
In physics terms, they were often implicitly looking at the velocity component along the surface normal.
For a flat floor:
looks harmless.
Whereas:
looks fatal.
They weren't necessarily computing a proper dot product every frame, but the logic ended up resembling that.
What's funny is that the shortcut you're imagining would actually have been cheaper computationally:
if speed > threshold:
kill player
That's dirt simple.
But it would have felt awful.
Imagine Quake:
and instantly exploding because your speedometer happened to say 1201.
Players would perceive that as a bug immediately.
Even on 1990s hardware, the extra logic needed to distinguish "moving fast" from "impacting hard" wasn't particularly expensive.
The other reason you don't see many famous examples is that game developers were usually solving a very specific problem:
"How do I make falling hurt?"
not
"How do I simulate kinetic trauma?"
Those are completely different design goals.
As a result, the code path for damage often wasn't even reached during normal ground contact.
Landing might look like:
if touching_ground:
vertical_velocity = 0
and then separately:
if previous_vertical_velocity > threshold:
apply_damage
The horizontal component never enters the conversation.
There are places where something close to your Back to the Future scenario happened, but usually as bugs.
One classic category was velocity overflow.
A player acquires ridiculous speed through:
Then some subsystem says:
"Velocity is absurdly high. Something has gone wrong."
The result isn't always death.
Sometimes it's:
Those are the closest examples to the "88 mph and vanish" phenomenon.
What's especially interesting is that your imagined engine is actually more likely to appear in an early prototype than in a finished game.
A programmer building a test environment might absolutely write:
if player_speed > 2000:
kill_player()
simply as a sanity check.
The reason you don't hear stories about commercial games doing it is that such a rule would be discovered almost immediately and would make high-speed movement mechanics feel terrible.
So the historical trend was almost the opposite of what you'd expect:
In other words, bunny hopping survived not because old engines were sophisticated enough to understand glancing impacts, but because they were primitive enough that they mostly ignored horizontal kinetic energy altogether. That's a surprisingly lucky accident for the entire movement-tech community.
M: Okay, yeah, so when I was saying normalized, I was giving them too much credit, or at least a little more credit than they deserved because it wasn't towards the floor, but it was towards their definition of gravity at that point, a more rigid calculation, so not as much of a calculation as my version, but as we started to get into 3D things, there still would be the necessity to define whether or not something was sufficient enough to count as a wall if it was angled. Did they just say everything that wasn't perfectly horizontal counted, or did they explicitly define what counted as a floor surface or what in terms of what would count as checking for speed impacts from the two different orientations of vertical versus horizontal?
G: That's much closer to what actually happened.
By the time games got into true 3D environments, they couldn't just ask "am I touching the ground?" because now you had:
The engine had to decide whether a surface was:
And the usual answer was surprisingly elegant:
Look at the surface normal.
The surface normal is the vector pointing straight out of the surface.
For example:
A modern engine would literally classify surfaces based on the angle between the normal and the gravity direction.
For a flat floor:
normal = (0,0,1)
For a wall:
normal = (1,0,0)
Then the engine checks something equivalent to:
"How upward-facing is this surface?"
The mathematical version is essentially a dot product against the gravity-up direction.
If the result is high enough:
If it's low enough:
If it's negative:
This is where things get interesting for movement exploits.
Most engines have a maximum walkable slope.
For example:
depending on the game.
So the logic becomes:
if slope_angle < 45°
floor
else
wall
conceptually.
This is also where a lot of famous exploits came from.
Suppose a ramp is 44.9°.
The engine says:
Floor.
Suppose another is 45.1°.
The engine says:
Wall.
Those two surfaces look nearly identical to a human.
To the engine they belong to completely different categories.
Players eventually learned to abuse these boundary conditions.
In Quake-derived engines especially, movement code often branched based on whether you were:
Each state used different acceleration and friction rules.
The famous movement tricks frequently happened right at those classification boundaries.
A surface that the engine barely considered a floor might preserve momentum differently than one it barely considered a wall.
So in a sense, your intuition about "normalization" was correct.
The engine wasn't usually checking:
How fast am I moving into this surface?
for ordinary movement.
But it absolutely was checking:
What kind of surface is this?
using the surface normal.
Once it classified the surface as floor vs wall, completely different physics rules would activate.
The funny historical consequence is that movement communities eventually became experts in the engine's geometry classification.
A casual player sees:
"That's a ramp."
A speedrunner sees:
"That's a 44.7° surface with floor friction, but this one is 45.3° and therefore uses wall-slide behavior."
They're effectively reverse-engineering the same normal-vector tests the programmers wrote years earlier.
So the answer is: no, they generally didn't say "anything not horizontal is a wall." By the mid-1990s and certainly by the Quake era, they were usually classifying surfaces by their angle relative to gravity, which is a much more robust solution and one of the reasons ramps, stairs, and uneven terrain felt surprisingly natural even on hardware that was primitive by modern standards.
M: Okay, so here's a question that's a little bit more, I don't know what's the word, esoteric? It's, I'm asking a question that's a little bit more in the weeds. Okay, so with the formats that did look at the normal in order to determine whether it was a ceiling or a floor, was that done on the fly, or was it hardcoded when they were building the map and when it got loaded, so that it didn't have to do all the calculation on the run? I'm not sure which one I would guess at, because on one hand, less processing meant more speed, but on the other hand, it would be more information to load, which, especially at that time, might be significant enough that doing it at the moment of impact might turn out to be the better choice. I have a guess, but the only reason that I would be able to tilt one way instead of the other, and definitely would still call it a guess, is for reasons I don't want to disclose until you've answered.
G: That's a genuinely good engine-design question, because the answer changes depending on the era.
For Quake-era engines and most of their descendants, the answer is usually:
The normal was already available as part of collision detection, so there wasn't much reason to pre-classify surfaces as floor/wall/ceiling.
In other words, the expensive part wasn't computing the normal. The expensive part was figuring out what you hit.
Once the collision system says:
"You just hit polygon #572"
it almost always already knows the polygon's plane equation, and therefore its normal.
At that point, checking whether it's a floor is extremely cheap.
Conceptually:
collision found
↓
retrieve surface normal
↓
dot(normal, up_vector)
↓
floor or wall?
The last step is tiny compared to the collision search itself.
The thing that may surprise you is that many BSP-based engines (Doom's descendants, Quake, Half-Life, etc.) were already storing plane information because they needed it for rendering and collision.
A wall wasn't just:
wall = true
It was something more like:
plane:
normal = (...)
distance = (...)
So the normal often existed in memory already.
The engine wasn't calculating it from scratch every time you landed.
There's a subtle middle ground here.
The normal itself was often precomputed.
The classification wasn't.
So instead of storing:
surface 572 = floor
they stored:
surface 572:
normal=(0,0,1)
and then asked:
is this floor enough?
whenever needed.
Why?
Because different systems might use different thresholds.
For example:
If you hardcoded "floor" into the map, you lose flexibility.
If you store the normal, everyone can make their own decision.
Ironically, the memory argument actually pushes things toward storing the normal rather than storing the classification.
Suppose you have 50,000 polygons.
Each polygon already needs plane information.
Adding a separate floor/wall flag saves almost no computation while consuming additional storage and reducing flexibility.
Programmers generally dislike that trade.
Where preclassification did happen was at higher levels.
For example:
Those were often heavily precomputed because they were genuinely expensive.
The normal test wasn't.
A dot product is just a few multiplications and additions.
Even on a late-1990s CPU, that's basically free compared to collision detection.
So if I had to guess what led you to wonder about this, I suspect you're thinking along the lines of:
"Wouldn't repeatedly calculating surface orientation be expensive on a Pentium-era machine?"
And that's a very reasonable intuition.
The trick is that by the time you've already figured out which surface was hit, you've already done 99% of the work. Looking at that surface's normal and deciding "floor or wall?" is almost an afterthought.
In fact, many engine programmers would probably tell you the opposite of what people expect:
The normal wasn't computed because the player landed on the surface. The player could determine whether it was a floor because the normal was already sitting there as part of the surface definition.
Now I'm curious what your guess was, because this is exactly the sort of question where the wrong intuition can sound completely plausible.
M: Yeah, your explanation is pretty much an overly expanded version of answering the question already. They had the normal. So at that point, the only question would be what the nature of the movement loop and collision detection part was asking. Like you could alter it so that a collision at over 60 degrees was wall or over 30 degrees depending on what you wanted and whatever was running. But all of that you just answered really wasn't necessary as soon as you reminded me that in order to display correctly, anything that isn't kind of a Doom-level complicated version of Pac-Man would need a definition of what a normal was in order to display correctly. That right there is already a hard coding, so while the question that the movement loop asked might not be really sensical in terms of human motion, it was a already encoded element that could easily be spot-checked to define whether it was a wall or a... floor or even a ceiling just by checking that normal that already existed, it does raise a secondary question for me, though. How many of the early 3D engines actually accounted for ceilings as their own plane of entity? Like, did they all generally treat everything horizontal equally in terms of vertical motion and whether high impact could splat you, or was there a group of them that tended to allow for super high-speed launches into the ceiling, but that could cause death upon impact with the floor at a lesser velocity?
G: That's actually a very interesting historical question, and the answer is that many early 3D engines treated ceilings asymmetrically with floors, not because they couldn't identify them, but because there wasn't much gameplay reason to care.
Once you have the normal, identifying a ceiling is trivial:
The question becomes: what do you do with that information?
And for a surprising number of games, the answer was:
"Almost nothing."
Think about the typical FPS player in 1996.
They can:
They cannot:
As a result, ceiling impacts are rare.
Floor impacts happen constantly.
So developers spent effort on:
while ceilings often got:
bonk
vertical velocity = 0
and that's the end of the story.
In fact, a lot of old FPS engines effectively treated ceilings as "anti-floors."
Floor contact often triggered special logic:
Ceiling contact frequently just canceled upward motion.
Something conceptually like:
if hit_ceiling:
vertical_velocity = min(vertical_velocity, 0)
The engine wasn't asking whether the impact should hurt.
It was asking how to prevent the player from entering solid geometry.
This creates exactly the asymmetry you're wondering about.
Imagine:
Many engines would:
Downward
Upward
No damage at all.
Same speed. Different result.
Part of this comes from game design rather than technical limitations.
Players generally accept:
"Huge fall = damage."
Players are less accepting of:
"You jumped into a doorway and lost 20 health."
So even if the engine could calculate ceiling impact damage, many designers wouldn't want it.
Where things started changing was in engines that allowed extreme vertical movement.
Examples include:
Once players could routinely reach ceilings at absurd speeds, developers had to decide whether upward impacts should matter.
But even then, many games retained the old asymmetry simply because that's what players expected.
The really funny consequence is that some engines ended up with what amounts to an "upward invulnerability loophole."
If you somehow acquired enough upward velocity:
The engine wasn't secretly computing impact energy and deciding you survived.
The engine often wasn't computing impact energy at all.
It was running two completely different pieces of code:
if landed:
maybe damage
versus
if hit ceiling:
stop moving upward
Which means that, historically speaking, there absolutely were engines where being launched into a ceiling at a speed that would have turned the equivalent downward impact into paste resulted in nothing more than a loud thunk and an immediate change of direction. That wasn't usually because the programmers believed ceilings were soft; it was because floor impacts had a dedicated damage system and ceiling impacts often never got one.
M: Yeah, because I vaguely remember that underlying thought that it was weird because, you know, a lot of games will either occasionally or frequently have some kind of launcher. And usually that leads to a situation where you're trying to get up on a ledge, and if you do it wrong, you'll go high-speed, like three times fatal velocity into the edge of the ledge without having any kind of damage, but then have to worry about landing because, you know, you got launched up high enough with the speed that should crush your skull, but then have to worry about your character popping a tendon or taking otherwise some kind of fall damage simply because of how high you had almost managed to get with the launch.
G: Exactly.
And once you notice it, you start seeing it everywhere.
A lot of games historically treated vertical motion less like "a body moving through space" and more like "a jump state machine."
The engine isn't really asking:
"What happened to the kinetic energy?"
It's asking:
"Are you going up, down, or standing on something?"
Which leads to the odd situations you're describing.
You get launched by:
and the game is perfectly happy to let you:
The dangerous part isn't the skull-crushing impact at step 2.
The dangerous part is often step 4.
From a physics perspective that's backwards, but from a gameplay perspective it makes perfect sense because the designers only built a damage model for falling.
One way to think about it is that many older games had a concept of:
"Dangerous velocity"
rather than
"Dangerous impact."
And dangerous velocity usually meant:
Downward velocity when becoming grounded.
Not:
Relative velocity between player and surface.
So the engine might never care that you hit a ledge at 200 mph.
It only cares that you landed while moving downward at 60 mph.
There's a related phenomenon that speedrunners and exploit hunters love.
Sometimes you can convert one kind of velocity into another in ways the engine doesn't fully understand.
For example:
Or the reverse:
The engine's damage model and movement model are often not measuring the same thing.
What's especially amusing is that real humans have almost the opposite problem.
In reality, your body doesn't care much whether the impact came from:
Your tissues mostly care about acceleration and force.
The distinction between "floor impact" and "ceiling impact" is largely irrelevant to your skeleton.
A game engine, however, may literally contain logic equivalent to:
floor = maybe death
ceiling = boink
because those cases were written by different programmers, at different times, for different gameplay purposes.
So the weird feeling you're remembering isn't a misunderstanding of how those games worked. It's often a genuine inconsistency. The player is subconsciously interpreting the world as a physical place, while the engine is treating it as a collection of special-case rules:
That's one of the reasons movement exploits became such fertile ground for speedrunners. They were probing the seams between systems that each made sense individually but didn't always agree with each other when pushed to extremes.