Creating Scenes

Before you render anything, you need to put all of your lights, cameras, and meshes into a scene. The Scene object keeps track of the relative poses of these primitives by inserting them into Node objects and keeping them in a directed acyclic graph.

Adding Objects

To create a Scene, simply call the constructor. You can optionally specify an ambient light color and a background color:

>>> scene = pyrender.Scene(ambient_light=[0.02, 0.02, 0.02],
...                        bg_color=[1.0, 1.0, 1.0])

You can add objects to a scene by first creating a Node object and adding the object and its pose to the Node. Poses are specified as 4x4 homogenous transformation matrices that are stored in the node’s Node.matrix attribute. Note that the Node constructor requires you to specify whether you’re adding a mesh, light, or camera.

>>> mesh = pyrender.Mesh.from_trimesh(tm)
>>> light = pyrender.PointLight(color=[1.0, 1.0, 1.0], intensity=2.0)
>>> cam = pyrender.PerspectiveCamera(yfov=np.pi / 3.0, aspectRatio=1.414)
>>> nm = pyrender.Node(mesh=mesh, matrix=np.eye(4))
>>> nl = pyrender.Node(light=light, matrix=np.eye(4))
>>> nc = pyrender.Node(camera=cam, matrix=np.eye(4))
>>> scene.add_node(nm)
>>> scene.add_node(nl)
>>> scene.add_node(nc)

You can also add objects directly to a scene with the Scene.add() function, which takes care of creating a Node for you.

>>> scene.add(mesh, pose=np.eye(4))
>>> scene.add(light, pose=np.eye(4))
>>> scene.add(cam, pose=np.eye(4))

Nodes can be hierarchical, in which case the node’s Node.matrix specifies that node’s pose relative to its parent frame. You can add nodes to a scene hierarchically by specifying a parent node in your calls to Scene.add() or Scene.add_node():

>>> scene.add_node(nl, parent_node=nc)
>>> scene.add(cam, parent_node=nm)

If you add multiple cameras to a scene, you can specify which one to render from by setting the Scene.main_camera_node attribute.

Updating Objects

You can update the poses of existing nodes with the Scene.set_pose() function. Simply call it with a Node that is already in the scene and the new pose of that node with respect to its parent as a 4x4 homogenous transformation matrix:

>>> scene.set_pose(nl, pose=np.eye(4))

If you want to get the local pose of a node, you can just access its Node.matrix attribute. However, if you want to the get the pose of a node with respect to the world frame, you can call the Scene.get_pose() method.

>>> tf = scene.get_pose(nl)

Removing Objects

Finally, you can remove a Node and all of its children from the scene with the Scene.remove_node() function:

>>> scene.remove_node(nl)