| | .. _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 |
| |
|
| |
|