In this guide I will explain how Ball 3D gameplay works inside. I will show you all the numbers you need to know. If you play Ball 3D for a long time, you may know most of these things, but I bet at least one thing will surprise you.
Things described in this guide are relevant to the Ball 3D ver. 3.29, updated on 8 April 2020.
After the 3.29 update you are able to see some usable info: FPS, Player Speed, Slowdown, Ping, Latency and Network info. Enable these 3 indicators in the Options->Info or use the commands in the chat (type /help to see them: /info_fps, /info_speed, /info_slowdown, /info_ping, /info_latency, /info_network).
I have came up with the Ball 3D idea in may 2012. Below is the first screen I have ever taken from the game.
The game was inspired by Haxball and it would probably have never been created if not the unexplained urge I had before the Euro 2012 (organized by Poland, the country I am from) to play some soccer.
When I started designing the game, I wanted to let players do as many moves as possible. I started by creating a 3D model in Blender. First idea was that players will have legs and the legs only. The player could control every leg to do all kind of movements/tricks.
I have quickly realized that making such game is an impossibility. There is no way to control 2 legs separately just with the mouse and keyboard (mind reading could work, if my grandson is reading this, go ahead with this idea). So I decided to go into an opposite direction and invent the simplest possible shape that at the same time would give players as much control as possible.
The famous disc was born. I have cut the top edge of it on purpose, not only because it looks better, but because it gives you more control over the ball. The main usage of this top shape was to kick the ball with a higher angle. We didn’t have the shift back then to kick vertically, so the only way to kick high was to go on the ball, then backward (to make the ball roll) and then by going forward the ball rolled on you a bit and you could kick it higher. This trick is possible even today.
I have then introduced many other movements, as many as I could, to give you as much freedom as possible with the disc shape. Some were implemented in the later updates.
I have been working 24/7 for the next 5 weeks to create the whole game from scratch. Every single detail of the game was designed to make it fun for the players.
I had 0 experience in Networking before so I have learned everything from 0. About 4 weeks after I have started, I had the whole game ready but without the networking. I was not even sure if I will be able to implement it (making real time multiplayer games is not an easy job). It turned out that I was able to do it and on 2nd January 2012 I have released Ball 3D as a web browser game (Unity plugin installation was required).
The game was hosted by people, in the browser, there was no antilag. Playing the game was really difficult (the movement latency was horrible). Yet people started playing. One or two days after the release, the link to the Ball 3D was posted on the front page of one big Polish website. Without this link I am not sure if you would read this guide today. I am not sure if the game would get popularity at all and if I would work on it for the next 8 years.
I have created countless updates since the release. You can read about most of them under this link: http://www.ball3d.com/news/page/10/
I have stopped posting the news there in 2017, so for info on further updates you need to go to the Ball 3D facebook: https://www.facebook.com/pg/ball3dgame/photos/
I think I have made about 200 updates since 2012. I don’t count anymore.
I recommend you to read the 10 news pages and to read the facebook to see what kind of features I have added and how Ball 3D was evolving over almost a decade.
I have been thinking about adding antilag since the beginning. In 2013 I was able to release Ball 2D (my other game) with antilag (it was bugged, but was more or less working). Implementing antilag is difficult, but I would do it, the problem was that in Unity it was not possible. To create the antilag you need a function that would let you simulate the physics in time. It means that you need a way to simulate the world fore example 100 milliseconds into the future. In Unity it was not possible, such function was not available. But I was so determined to do the antilag and finally I decided that I will figure out how to do this.
In Unity there is this variable Time.timeScale, when you set it to 0 the game pauses, when you set it to 100, the game moves 100 times faster. This variable was the only chance for an antilag. I have spent 4 months in 2016 implementing this. Almost every day I was working step by step to figure out how to hack Unity to do the antilag. When you set Time.timeScale to 100, everything is 100 faster, so I had to figure out ways to make particles, animations and other things work normally while keeping the game working on that timeScale.
You can read more about my antilag journey here: https://forum.unity.com/threads/physics-and-prediction.158514/
Finally I have added the game to Steam in 2017. The Steam algorithm liked the game and we had almost 500 000 new players trying the game in the first month. Too bad most of them thought this game was a joke or a Rocket League ripoff (Ball 3D was created long before the famous Rocket League, so it is not true).
Ball 3D Unit
Whenever you are describing a length in the real world, you must use some sort of a unit. For example you may say “the length of this line is 1 meter”. In Ball 3D we don’t use meters because there is no way to define the meter in the Ball 3D world (we don’t have any point of reference). So we will define our own unit.
The Ball 3D Unit is equal to the diameter of the avatar (the disc) you control while playing. It is as simple as that.
Since now, whenever I will say “the length of this line is equal to 3 units”, you should know that it is equal to 3 diameters of the disc you control when playing.
Horizontal movement takes place when you move left, right, forward and backward.
Vertical movement takes place when you jump or fall (up and down).
These two kind of movements are independent. It means that if you jump it doesn’t affect the way you move horizontally. In other words: when you are in the air, you can move horizontally as you would be on the ground. The jumping also always work the same, no matter if you move while jumping or not.
The maximum horizontal speed in Ball 3D is 3 units / second. It means that every second you move 3 Ball 3D Units (the Unit was already described in a previous section). You can use the /info_speed command to see the speed. Test it for yourself to see how it works.
The vertical speed (jumping) is nonlinear. The longer you press the jumping button, the faster you move upward.
The movement in Ball 3D has been tweaked by me over the years. I have been adding countless improvements to fight the latency (we didn’t have the antilag and dedicated rooms for many years, so it was a huge problem). Everything was designed to fight the latency, including the jumping.
Originally the game was 2 times faster, but I have divided all the speeds by 2 before the release, to hide the input latency.
The concept of a slowdown has been introduced some time ago and has been tweaked in the 3.29 update.
When the edge of your disc is 1.5 units or less away from the closest point of the ball (not from the center), the slowdown starts working. The lower the distance from the ball, the bigger the slowdown. When you touch the ball your speed can go to as low as 2.56 units per second (u/s).
Use the /info_slowdown command to see the slowdown. Test it on your own host to see when you are slower.
When you have the ball, you should kick it forward a bit, to contradict the slowdown. You can also jump to make the slowdown lower (because the vertical distance will increase so the slowdown will decrease). In 3.29 update I have tweaked the code and the slowdown is now more consistent.
Where you are chasing the player, the best strategy is to jump high when you are close to him or when you are standing on him. Since 3.29 the chasing is much more exciting, even without jumping you should be able to chase the player, but jumping will give you additional boost.
Try this with a friend. Chase him and look at the /info_speed and /info_slowdown indicators to see what works best.
The fastest way to switch the direction is to keep pressing the forward key and change the direction with one fast mouse move, to a desired one.
Look at the Player Speed, if you press left or right during the direction switch, your speed will decrease a bit for a few milliseconds and you will also waste some time by moving not by the shortest possible path.
If you will keep pressing the forward button and switch the direction only with your mouse, your speed will stay on 3 units per second all the time. Use the /info_speed to test this, but do this on your own server.
It takes 0.5 second to maximally load the kick power.
The maximum kick power is 15 units per second.
For the kick to work:
- The center of the ball has to be in a distance lower than 1 unit from the center point of your disc.
- The vertical distance needs to be lower than 0.55 unit.
The center point of your disc is located at the bottom of your disc as depicted below.
The diameter of the disc is 1 unit, and the height is 0.23 unit.
The diameter of the ball is almost 0.6 unit.
It means that if the other player is on top of you, you will not be able to kick a ball that is on top of him, because the center of the ball will always be too far (0.23 of your height, 0.23 of his height and the radius of the ball is almost 0.3 units).
It also means that if you want to kick the ball when it is above you, it needs to be very close to you. If the ball is below you, it can be a little further.
When you load the kick power and the ball is not within the required distance, the kick will stay loaded for the next 0.3 second (300ms), if the ball will go into your reach during this time, the kick will be activated and the ball will be kicked. This mechanic was added in the very first update in 2012.
If you would like the kick to be loaded all the time (for example when you are a goalkeeper), you can achieve this by loading the kick bar to 3/5 of it’s full power.
When you kick, the direction of the kick is a vector that starts about 0.15 unit below the bottom of your disc and ends in the center of the ball. Thanks to this, you can kick the ball low if you jump a little bit while you are kicking. This is the most important Ball 3D move.
Whenever you kick the ball, no matter if it’s a normal kick, curved kick or a vertical kick (also called the SHIFT kick), the velocity is always added to the current velocity of the ball. You kick never erase the ball’s velocity, it always adds to it.
The maximum kick power is 15 u/s, and the speed of the maximum speed of the player is 3 u/s decreased a bit by the slowdown. It means that when you go with the ball and you kick with the maximum power the speed of the ball will be about 17.5 u/s. It will decrease with time due to the air resistance.
If you are a GK and you are using the trick I have mentioned above (to have the kick always loaded), your kick potential is 9 u/s. It is not enough to stop the ball kicked with full power, so you need to stop it with your disc. But it is enough to change the direction of it a bit.
The other thing you can do is to use the upper part of your disc. If the ball touches your upper part, it’s vertical speed is changed to 0 u/s. It means that your kick power will overtake the vertical velocity.
Make sure that you will have as little details on the screen as possible. Those will distract you from the game and also will make it harder to see when the ball is in the air.
- Turn the audience and tribunes off with the /tribunes 2 command.
- Turn the 3D grass off in the options (unless you feel better when it’s on).
- If you have a PRO account, change the ball to some more visible than the standard one. Red color is the most visible against the green grass, so a ball with some red on it should work.
- Increase the /fov, I prefer to play with the /fov 100. You see more with the bigger fov and you can rotate faster to the desired direction. If things look weird to you, make sure you use the 16:9 resolution and consider bringing the monitor closer to your eyes if it’s far away. This should help a bit (but don’t put the monitor too close as it may hurt your eyes).
- Play on fullscreen and use a wide resolution (16:9) to see even more.
The faster your reaction time, the better. To react quickly, take some time to configure your mouse and keyboard.
First thing to do is to download the newest drivers to your mouse. Then spend some time tweaking the /sensitivity value and the /fov value. Set it in a way that will let you see as much as possible and rotate as fast as possible. Try to do some 180 degree turns (go into one direction and try to go into the opposite direction by rotating as fast as possible in one move of the mouse). You need to be able to do such turns in one move, if you can, then you have configured everything properly. Remember that after every change you need some time to learn before you will feel comfortable.
Key configuration is also very important. You will need to press many buttons so make sure you can comfortably reach all of them. I have been always playing using Q and E to curve the ball, but if you move using ASDW (also called WSAD), then you will have some trouble pressing all the keys. If you have additional buttons on your mouse, consider using those. You may also try to use the mouse wheel to curve, but Ball 3D doesn’t let you bind it, so you will have to use some key mapper or an application (maybe from the producer of your mouse) that could map the mouse wheel movement to Q and E. In the end you can also try to curve the Ball with the the mouse movement as some players do (you can pick this option in the Ball 3D options menu), but it’s not that easy to learn.
The smaller the key, the faster you will be able to press it and your finger will tire less. I have been always jumping with the space button, but it lowers my reaction time a bit, because this button is big. To solve this, consider playing on JKLI and jumping with Right Alt rather than on ASDW and Space. If you are already playing Ball 3D for a long time, it may be difficult to switch to other keys. It is not so important so if you have hard time, just play with your usual keys and don’t worry about it. Your decisions during the game and what you do on the field are much more important than the size of the keys you press.
Make sure that the most commonly used keys are close to your fingers. Even better if your fingers are already touching those keys.
Frames of latency 0 is the best, because you play with 0 latency and immediately see how your input will affect your avatar. The problem is that on a higher ping you may see some errors in prediction. If you move the ball yourself the game will predict it perfectly, but the movement of other players and their kicks can be predicted only to some degree.
In the 3.29 update, I have introduced new options. Now I recommend you to turn the vsync to off in the menu or with the command /vsync 0, and set the max_fps to a value like 120 or 240. If your monitor is refreshing with 60Hz, then multiple this value by 2, 3 or 4. You can first set this value to a maximum (900) and see how many fps your computer is able to render. If you set the value to 240, you have to make sure that your computer will always be able to render 240 frames per second. Otherwise the game will not feel smooth.
To check the refresh rate of your monitor set the vsync to on and use /info_fps 1. The number of fps you see is probably the refresh rate of your monitor.
To achieve 240 frames per seconds, turn all the graphics options down: disable tribunes with /r_tribunes 2, disable 3D grass, set antialiasing to off.
Use the maximum (native) resolution of your computer. Other resolutions can add some latency.
Playing with vsync off and some high max_fps value, will decrease your latency, because your inputs will be proceeded faster and you will be able to see the rendered world faster. When you play as a client (connected to some server), your inputs are being send 60 times per second to the server because you have 60fps. In Ball 3D the client’s sending rate is limited by the fps.
Let’s say you have a monitor with refresh rate equal to 60Hz and vsync turned on. Now you press the left button to move the disc to the left. After pressing the key on your keyboard, you will need to wait from 0ms to 16ms for the discs to move on your screen (In some cases it may be even 32ms). With vsync turned off, it will be always 0ms. So the game will feel more responsive.
But that’s not the end of good news for those who turn vsync off! Just look at the command /info_latency (I am describing it in a section below). It shows much lower latency when you have vsync off and more fps. How is this possible?
I have set the network client sendrate to 1000. Because of this the actual sendrate of the client is limited by its fps. If you will turn the fps up, your computer will send the data more times per second. Use /info_network 1 to see the sendrates (test when you connect to a room).
I recommend you to turn vsync off, because you will gain a lot of responsiveness and decrease the latency by a lot. If you will play in max_fps 240 then:
- Your input will be send 12ms faster to the server (your moves will be quicker as if your ping would be 24ms better).
- You will render the data from the server as soon as your computer receive it (it can decrease the latency from 0 to 16ms further)
- On top of that I have already explained that your inputs will be rendered from 0 to 16ms faster with the antilag 0.
The most important part is that your input will be send to the server much faster. When you kick, the server will know about this 12ms earlier than with vsync on.
The only downside is that you may experience a tearing effect from time to time, but it should not be too visible. If it’s very visible you can experiment with different /max_fps values. As I said I recommend you to multiple your monitor refresh rate (the number of fps you have when vsync is on) by some number and set /max_fps to this number. Fortunately Ball 3D is very tearing friendly. It means tearing is hardly noticeable, especially if you play with /r_tribunes 2.
Test all of this on fullscreen.
Turning vsync off and rendering a high number of fps will make your CPU and GPU work all the time, so if you are playing on a laptop, your battery will discharge faster.
Latency vs Ping
In the 3.29 update I have introduced /info_ping and /info_latency commands.
The /info_ping command just shows you the ping you know from other places in Ball 3D. The /info_latency command only works when you join the red or blue team. It shows you what is the real latency you experience.
What is the difference? Ping is just a way to see how quickly packets travel from the client to the server. When a server is receiving the ping, it responds immediately to it. But when Ball 3D (and other games too) sends something to the server, the server is not responding immediately. It responds according to the sendrate (on dedicated rooms it is 60 times per second, on hosted rooms only 17 times per second). Other factors may affect the latency too (like frame rate of the server, frame rate of the client, send rate of the server, send rate of the client). The latency tells you more about the situation than the ping.
Ping is a more famous concept and you know it from other games, so you have a better comparison. But latency can show you not only the ping but also how good the hosting server is and how well is your computer working in terms of latency.
You will see a big difference in latency when playing on dedicated rooms vs hosted rooms. Try to find a host when you have the same ping as on the dedicated servers and compare the latency. You will be surprised as the latency on dedicated rooms will be much better. It means the dedicated rooms offer not only better pings but also something more. I explain this in the next section below.
The hosted servers use sendrate 17 while dedicated servers use 60. In practice it means that if you have ping 50ms on a dedicated room and 50ms on a room hosted by a player, the real latency is 42ms lower on dedicated than on a hosted room. The ping will still show 50ms on both, but the latency on a dedicated room is 42ms lower!!! That’s why dedicated rooms are so amazing (but they cost money).
The dedicated servers are also located in a better place in the network, so the ping is lower there for everybody.
If you are curious why hosted rooms send less than dedicated, the answer is simple. People don’t have connections as good as the dedicated servers. In the future I may increase it, but I recommend everyone to play on dedicated rooms all the time.
If you are curious why the sendrate is 17 and not 20… I have set it to 20, but it turns out that due to some weird code in the old Unity networking, when you set the sendrate to 20 it sends 17 times per second. I could compensate this, but this value is working since the beginning and if I would increase it then some people will not be able to host anymore.
The conclusion: dedicated rooms are much better than hosted rooms.
- Would you like to repeat something on the chat? Press the up arrow key on your keyboard to see your previous messages. Use up and down arrow keys to change the messages from the history.
- Press the period . key when recording the replay to mark interesting situations with a green dot. When you will be watching the replay, you will see a green dot on a timeline.
- Write /help on the chat to see commands.
- There is a search box next to the room list. You can use it to search for room names, player names, tags and even stadiums. Type the tag of your team to find friends from your team.