View meshes and scenes via pyglet or inline HTML.

class trimesh.viewer.SceneViewer(scene, smooth=True, flags=None, visible=True, resolution=None, start_loop=True, callback=None, callback_period=None, caption=None, fixed=None, offset_lines=True, line_settings=None, background=None, window_conf=None, profile=False, **kwargs)

Bases: pyglet.window.BaseWindow

add_geometry(name, geometry, **kwargs)

Add a geometry to the viewer.

  • name (hashable) – Name that references geometry

  • geometry (Trimesh, Path2D, Path3D, PointCloud) – Geometry to display in the viewer window

  • ** (kwargs) – Passed to rendering.convert_to_vertexlist


Remove any stored vertex lists that no longer exist in the scene.


Don’t display the geometry contained at a node on the next draw.


node (str) – Node to not display


Perform the magic incantations to create an OpenGL scene using pyglet.


Run the actual draw calls.

on_key_press(symbol, modifiers)

Call appropriate functions given key presses.

on_mouse_drag(x, y, dx, dy, buttons, modifiers)

Pan or rotate the view.

on_mouse_press(x, y, buttons, modifiers)

Set the start point of the drag.

on_mouse_scroll(x, y, dx, dy)

Zoom the view.

on_resize(width, height)

Handle resized windows.


Set view to the default view.


flags (None or dict) – If any view key passed override the default e.g. {‘cull’: False}


Save the current color buffer to a file object in PNG format.


file_obj (file name, or file- like object) –


Toggle a rendered XYZ/RGB axis marker: off, world frame, every frame


Toggle back face culling.

It is on by default but if you are dealing with non- watertight meshes you probably want to be able to see the back sides.


Toggle between fullscreen and windowed mode.


Toggle a rendered grid.


Toggle wireframe mode

Good for looking inside meshes, off by default.


If a node is hidden remove the flag and show the geometry on the next draw.


node (str) – Node to display


Check the view flags, and call required GL functions.

class trimesh.viewer.SceneWidget(scene, **kwargs)

Bases: glooey.widget.Widget


Return the minimum width and height needed to render this widget.

Most widgets need to implement this method. The exception is widgets that have exactly one child. In that case, there’s a reasonable default: claim just enough space for that child. Most composite widgets are covered by this default, because they typically have a container widget as their only child and attach any other widgets they need to that container.


Draw any shapes or images associated with this widget.

This method is called by _draw() after it checks to make sure the widget is attached to the root of the GUI hierarchy and that the rect, group, and batch attributes have all been set.

This method is called both to draw the widget for the first time and to update it subsequently. This usually means that you need to check to see if your graphics objects and resources need to be initialized yet.


React to a change in the widget’s pyglet graphics group.

In pyglet, groups are used to control layers and OpenGL state. This method is called whenever the widget’s group is changed, for example when the widget is attached to the GUI or moved from one part of the GUI to another.

Only widgets that actually draw things need to implement this method, because groups aren’t used for anything but drawing. Widgets that contain other widgets may need to implement do_regroup_children() to describe how those children should be regrouped.

It’s not always trivial to change the group used to draw something in pyglet. The way to do this depends on what’s being drawn and whether or not it’s been drawn before. The simplest case are high-level APIs like pyglet.sprite.Sprite that allow you to simply change a group attribute. On the other hand, if you’re drawing vertex lists yourself, you need to call the method. This method needs to know the OpenGL mode (e.g. GL_QUADS) associated with the vertex list, so you will have to keep track of that.

Keep in mind that this method is called before the widget is drawn and may be called after it’s been undrawn, so any vertex lists created in the draw function may or may not exist yet/anymore. If those vertex lists don’t exist yet, there’s nothing this function needs to do. The _draw() function will be called when the widget’s ready to draw, and at that point the vertex lists should be created with the right group.


Delete any shapes or images associated with this widget. This method may be called before _draw().

on_mouse_drag(x, y, dx, dy, buttons, modifiers)

React to the mouse being dragged within this widget.

The on_mouse_drag event is propagated to any children that remained under the mouse, an on_mouse_drag_enter event is triggered in any children that just came under the mouse, and an on_mouse_drag_leave event is triggered in any children that were previously under the mouse but no longer are.

on_mouse_press(x, y, buttons, modifiers)

React when the mouse is pressed on this widget.

The on_mouse_press` event is propagated to any children under the mouse, an ``on_mouse_hold event is started, and an on_rollover event is fired to indicate that the widget’s rollover state is now “down”.

on_mouse_scroll(x, y, dx, dy)

React to the mouse scroll wheel being turned.

The on_mouse_scroll event is propagated to any children under the mouse.

property scene_group

Check to see if we are in an IPython or Jypyter notebook.


in_notebook – Returns True if we are in a notebook

Return type


trimesh.viewer.render_scene(scene, resolution=None, visible=True, **kwargs)

Render a preview of a scene to a PNG. Note that whether this works or not highly variable based on platform and graphics driver.

  • scene (trimesh.Scene) – Geometry to be rendered

  • resolution ((2,) int or None) – Resolution in pixels or set from

  • visible (bool) – Show a window during rendering. Note that MANY platforms refuse to render with hidden windows and will likely return a blank image; this is a platform issue and cannot be fixed in Python.

  • kwargs – Passed to SceneViewer


render – Image in PNG format

Return type



Return HTML that will render the scene using GLTF/GLB encoded to base64 loaded by three.js


scene (trimesh.Scene) – Source geometry


html – HTML containing embedded geometry

Return type


trimesh.viewer.scene_to_notebook(scene, height=500, **kwargs)

Convert a scene to HTML containing embedded geometry and a three.js viewer that will display nicely in an IPython/Jupyter notebook.


scene (trimesh.Scene) – Source geometry


html – Object containing rendered scene

Return type