Scene, Entity, Component, and System#
Overview#
A Scene
contains a list of Entity
and a list of System
. An Entity
contains a list of Component
. A Component
should register itself to a corresponding System
.
Scene#
Everything simulated or rendered needs to live in a 3D world. SAPIEN calls this
world Scene
. A scene is simply constructed with sapien.Scene()
. A scene
does 2 things: holding a list of Entity
and managing a list of System
.
We will now explain the role of Entity
and System
.
Entity#
Every object in the SAPIEN scene is an Entity
, from robot links, tables, to
lights and cameras. The specific functionalities of an Entity
is specified
with its attached components.
Formally, an Entity
in SAPIEN has a 6-D Pose
, i.e. position and
orientation, and a list of attached components. To give an entity specific
functionalities, you need to attach components to it through entity.add_component(...)
.
A PhysxRigidDynamicComponent
makes the entity a rigid body that interacts
with PhysX physical simulation. A RenderbodyComponent
assigns the entity a
visual appearance so it can be rendered by a camera, which is another entity
with a RenderCameraComponent
attached.
Component#
The Component
is the fundamental concept that gives SAPIEN entities their
functionalities. Each component may have very different purposes, but they all
implement 2 functions add_to_scene
and remove_from_scene
.
Let’s take a look at PhysxRigidDynamicComponent
as an example. When an
entity with this component is added to scene. The add_to_scene
function is
called. Which first queries the scene for a PhysxSystem
, which contains a
simulation scene from PhysX. Then the PhysxRigidDynamicComponent
registers
itself into the PhysxSystem
, which adds a PhysX rigid dynamic actor into the
simulation scene. In the future, when the step function of the PhysxSystem
is called, PhysxSystem
synchronizes the updated poses to the
PhysxRigidDynamicComponent
, which updates the pose of the sapien Entity
.
Components on an entity can be obtained by entity.components
or
entity.find_component_by_type
. For example, to retrieve a component of type
PhysxRigidDynamicComponent
, you could use
entity.find_component_by_type(sapien.physx.PhysxRigidDynamicComponent)
System#
As we can see from the example in the component section. A System
can
perform actions over a set of specific components. For example, PhysxSystem
can update PhysX-related components, and RenderSystem
manages render bodies
and cameras to perform rendering.
Note
While SAPIEN features Entity
, Component
, and System
. SAPIEN is
not an ECS (Entity component system)
architecture but simply borrows the concepts from ECS, similar to the Unity game engine.