Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Game engines: What are scene graphs?

I've started reading into the material on Wikipedia, but I still feel like I don't really understand how a scene graph works and how it can provide benefits for a game.

  • What is a scene graph in the game engine development context?
  • Why would I want to implement one for my 2D game engine?
  • Does the usage of a scene graph stand as an alternative to a classic entity system with a linear entity manager?
like image 691
Loms Avatar asked Mar 15 '11 23:03

Loms


People also ask

What is a scene graph used for?

A scene graph is a general data structure commonly used by vector-based graphics editing applications and modern computer games, which arranges the logical and often spatial representation of a graphical scene. It is a collection of nodes in a graph or tree structure.

What is opengl scene graph?

A scene graph is not a class or an object, it's more like a pattern that allows you to create inheritance. This pattern is used a lot in game engines. For example, it is used in animation to manage bones. If I move my arm, my hand needs to move too. To obtain this result, I need a hierarchy with parents and children.

What is a 3D scene graph?

3D Scene Graph: It consists of 4 layers, that represent semantics, 3D space and camera. Elements are nodes in the graph and have certain attributes. Edges are formed between them to denote relationships (e.g., occlusion, relative volume, etc.).

What are the three types of nodes for a scene graph?

Nodes are divided into three basic categories: Shape nodes, which represent 3D geometric objects. Property nodes, which represent appearance and other qualitative characteristics of the scene. Group nodes, which are containers that collect nodes into graphs.


2 Answers

What is a scene graph in the game engine development context?

Well, it's some code that actively sorts your game objects in the game space in a way that makes it easy to quickly find which objects are around a point in the game space.

That way, it's easy to :

  1. quickly find which objects are in the camera view (and send only them to the graphics cards, making rendering very fast)
  2. quickly find objects near to the player (and apply collision checks to only those ones)

And other things. It's about allowing quick search in space. It's called "space partitioning". It's about divide and conquer.

Why would I want to implement one for my 2D game engine?

That depends on the type of game, more precisely on the structure of your game space.

For example, a game like Zelda could not need such techniques if it's fast enough to test collision between all objects in the screen. However it can easily be really really slow, so most of the time you at least setup a scene graph (or space partition of any kind) to at least know what is around all the moving objects and test collisions only on those objects.

So, that depends. Most of the time it's required for performance reasons. But the implementation of your space partitioning is totally relative to the way your game space is structured.

Does the usage of a scene graph stand as an alternative to a classic entity system with a linear entity manager?

No.

Whatever way you manage your game entities' object life, the space-partition/scene-graph is there only to allow you to quickly search objects in space, no more no less. Most of the time it will be an object that will have some slots of objects, corresponding to different parts of the game space and in those slots it will be objects that are in those parts. It can be flat (like a 2D screen divider in 2 or 4), or it can be a tree (like binary tree or quadtree, or any other kind of tree) or any other sorting structure that limits the number of operations you have to execute to get some space-related informations.

Note one thing :

In some cases, you even need different separate space partition systems for different purposes. Often a "scene graph" is about rendering so it's optimized in a way that is dependent on the player's point of view and it's purpose is to allow quick gathering of a list of objects to render to send to the graphics card. It's not really suited to perform searches of objects around another object and that makes it hard to use for precise collision detection, like when you use a physic engine. So to help, you might have a different space partition system just for physics purpose.

To give an example, I want to make a "bullet hell" game, where there is a lot of balls that the player's spaceship has to dodge in a very precise way. To achieve enough rendering and collision detection performance I need to know :

  1. when bullets appear in the screen space
  2. when bullets leave the screen space
  3. when the player enters in collision with bullets
  4. when the player enters in collision with monsters

So I recursively cut the screen that is 2D in 4 parts, that gives me a quadtree. The quadtree is updated each game tick, because everything moves constantly, so I have to keep track of each object's (spaceship, bullet, monster) position in the quadtree to know which one is in which part of the screen.

Achieving 1. is easy, just enter the bullet in the system.

To achieve 2. I kept a list of leaves in the quadtree (squared sections of the screen) that are on the border of the screen. Those leaves contain the ids/pointers of the bullets that are near the border so I just have to check that they are moving out to know if I can stop rendering them and managing collision too. (It might be bit more complex but you get the idea.)

To achieve 3 and 4. I need to retrieve the objects that are near the player's spaceship. So first I get the leaf where the player's spaceship is and I get all of the objects in it. That way I will only test the collision with the player spaceship on objects that are around it, not all objects. (It IS a bit more complex but you get the idea.)

That way I can make sure that my game will run smoothly even with thousands of bullets constantly moving.

In other types of space structure, other types of space partitioning are required. Typically, kart/auto games will have a "tunnel" scene-graph because visually the player will see only things along the road, so you just have to check where he is on the road to retrieve all visible objects around in the "tunnel".

like image 110
Klaim Avatar answered Sep 18 '22 20:09

Klaim


What is a scene graph? A Scene graph contains all of the geometry of a particular scene. They are useful for representing translations, rotations and scales (along with other affine transformations) of objects relative to each other.

For instance, consider a tank (the type with tracks and a gun). Your scene may have multiple tanks, but each one be oriented and positioned differently, with each having its turret rotated to different azimuth and with a different gun elevation. Rather than figuring out exactly how the gun should be positioned for each tank, you can accumulate affine transformations as you traverse your scene graph to properly position it. It makes computation of such things much easier.

2D Scene Graphs: Use of a scene graph for 2D may be useful if your content is sufficiently complex and if your objects have a number of sub components not rigidly fixed to the larger body. Otherwise, as others have mentioned, it's probably overkill. The complexity of affine transformations in 2D is quite a bit less than in the 3D case.

Linear Entity Manager: I'm not clear on exactly what you mean by a linear entity manager, but if you are refering to just keeping track of where things are positioned in your scene, then scene graphs can make things easier if there is a high degree of spatial dependence between the various objects or sub-objects in your scene.

like image 26
andand Avatar answered Sep 20 '22 20:09

andand