Spaces:
Sleeping
Sleeping
.. _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 | |
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 | |