Object streaming system for open world games

Recently I had a discussion on the discord regarding a feature that could be added without too much difficulty in my opinion to Armory3D given that all the basics are there.

Let me explain, you have already tried the “scene_stream” examples which allows you to stream several different objects (especially in html 5 with multi threading)
But this feature has these limitations, in fact it will not be possible to create an open world, zelda type or other with this method, because during the execution of the code, everything must still be loaded.

You also know the example “server stream” which allows you to download an.obj file from an external server, and display it in the game, without this 3D model being compiled with the game.

You also know the LOD system to display a more or less detailed model depending on the distance with the player

Here is the project / feature request I would like to make:
Create a system that connects these functions, I explain myself: The system I imagined would work like this:

  • At compile time, blender exports all meshes, their materials, and properties to a predefined folder (this can be an ftp server)
  • The executable (html or.exe contains a json (or other format maby) file created next to it, which contains all the locations (xyz, transform) of the meshes, and their direct link on the server (maby html link)
  • When the game is launched, the client sends a request to the server to have only models with right LOD from point of view (all close elements will be downloaded to LOD0 and far elements will be downloaded to LOD 5 or not if the elements are really too far away, and if the player move fare, then new model will be download, and the others are just remove or unspawn (to have more power).

This system would allow you to have a game in a browser, which loads very quickly, while still being able to have a potentially huge (mesh based) world.

Just as multiplayer minecraft users just have the textures / sound and gameplay code of the game store locally, and the map is sequentially loaded into the ram, as sometimes it can weigh several giga.

(the json file itself could be stored on the server, which makes updating the world more convenient if it is multiplayer)

I don’t know if this feature should be done with lubos as a feature request on github, or if other developers would be able to do this feature, because after all, the parts of the code needed to do this are already present, except for the part that records mesh data on a file (and is able to understand that several meshes can have only one object or one material can be assigned multiple times.)
Maybe the Entity component system could make the task easier

3 Likes

Idea sound good, but thing is it will eat through your internet really much or it will be ugly if you have low internet connection, i am pretty sure that armory’s contributors can handle stuff like this.

but thing is it will eat through your internet really much or it will be ugly if you have low internet connection

Yes the functionality has these limitations in the sense that to stream a detailed world like AAA similar to battlefield, with detailed textures, it will be necessary to have optical fiber, and the server load will increase if there are many players.

However, my project remains feasible for indie games (or not) with relatively weak models, see low poly, with sometimes no texture.

Perhaps it would be possible to assign some objects/texture to be inside the executable, and others that load sequentially.

Concerning chunk, with the LOD system, it is not necessarily square chunk as in minecraft (16*16) but maybe just a value (that can be modified) that loads the more or less distant elements.