bill-jiang's picture
Init
8554568
.. _viewer_guide:
Live Scene Viewer
=================
Standard Usage
--------------
In addition to the offscreen renderer, Pyrender comes with a live scene viewer.
In its standard invocation, calling the :class:`.Viewer`'s constructor will
immediately pop a viewing window that you can navigate around in.
>>> pyrender.Viewer(scene)
By default, the viewer uses your scene's lighting. If you'd like to start with
some additional lighting that moves around with the camera, you can specify that
with:
>>> pyrender.Viewer(scene, use_raymond_lighting=True)
For a full list of the many options that the :class:`.Viewer` supports, check out its
documentation.
.. image:: /_static/rotation.gif
Running the Viewer in a Separate Thread
---------------------------------------
If you'd like to animate your models, you'll want to run the viewer in a
separate thread so that you can update the scene while the viewer is running.
To do this, first pop the viewer in a separate thread by calling its constructor
with the ``run_in_thread`` option set:
>>> v = pyrender.Viewer(scene, run_in_thread=True)
Then, you can manipulate the :class:`.Scene` while the viewer is running to
animate things. However, be careful to acquire the viewer's
:attr:`.Viewer.render_lock` before editing the scene to prevent data corruption:
>>> i = 0
>>> while True:
... pose = np.eye(4)
... pose[:3,3] = [i, 0, 0]
... v.render_lock.acquire()
... scene.set_pose(mesh_node, pose)
... v.render_lock.release()
... i += 0.01
.. image:: /_static/scissors.gif
You can wait on the viewer to be closed manually:
>>> while v.is_active:
... pass
Or you can close it from the main thread forcibly.
Make sure to still loop and block for the viewer to actually exit before using
the scene object again.
>>> v.close_external()
>>> while v.is_active:
... pass