Added documentation on 3D graphics system

This commit is contained in:
Luke Campagnola 2012-04-23 14:34:54 -04:00
parent 41bc951a1c
commit 2149f9db29
18 changed files with 197 additions and 27 deletions

View File

@ -0,0 +1,48 @@
3D Graphics
===========
Pyqtgraph uses OpenGL to provide a 3D scenegraph system. This system is functional but still early in development.
Current capabilities include:
* 3D view widget with zoom/rotate controls (mouse drag and wheel)
* Scenegraph allowing items to be added/removed from scene with per-item transformations and parent/child relationships.
* Triangular meshes
* Basic mesh computation functions: isosurfaces, per-vertex normals
* Volumetric rendering item
* Grid/axis items
See the :doc:`API Reference </3dgraphics/index>` and the Volumetric (GLVolumeItem.py) and Isosurface (GLMeshItem.py) examples for more information.
Basic usage example::
## build a QApplication before building other widgets
import pyqtgraph as pg
pg.mkQApp()
## make a widget for displaying 3D objects
import pyqtgraph.opengl as gl
view = gl.GLViewWidget()
view.show()
## create three grids, add each to the view
xgrid = gl.GLGridItem()
ygrid = gl.GLGridItem()
zgrid = gl.GLGridItem()
view.addItem(xgrid)
view.addItem(ygrid)
view.addItem(zgrid)
## rotate x and y grids to face the correct direction
xgrid.rotate(90, 0, 1, 0)
ygrid.rotate(90, 1, 0, 0)
## scale each grid differently
xgrid.scale(0.2, 0.1, 0.1)
ygrid.scale(0.2, 0.1, 0.1)
zgrid.scale(0.1, 0.2, 0.1)

View File

@ -0,0 +1,8 @@
GLAxisItem
==========
.. autoclass:: pyqtgraph.opengl.GLAxisItem
:members:
.. automethod:: pyqtgraph.opengl.GLAxisItem.__init__

View File

@ -0,0 +1,8 @@
GLGraphicsItem
==============
.. autoclass:: pyqtgraph.opengl.GLGraphicsItem
:members:
.. automethod:: pyqtgraph.GLGraphicsItem.__init__

View File

@ -0,0 +1,8 @@
GLGridItem
==========
.. autoclass:: pyqtgraph.opengl.GLGridItem
:members:
.. automethod:: pyqtgraph.opengl.GLGridItem.__init__

View File

@ -0,0 +1,8 @@
GLMeshItem
==========
.. autoclass:: pyqtgraph.opengl.GLMeshItem
:members:
.. automethod:: pyqtgraph.opengl.GLMeshItem.__init__

View File

@ -0,0 +1,8 @@
GLViewWidget
============
.. autoclass:: pyqtgraph.opengl.GLViewWidget
:members:
.. automethod:: pyqtgraph.opengl.GLViewWidget.__init__

View File

@ -0,0 +1,8 @@
GLVolumeItem
============
.. autoclass:: pyqtgraph.opengl.GLVolumeItem
:members:
.. automethod:: pyqtgraph.opengl.GLVolumeItem.__init__

View File

@ -0,0 +1,24 @@
Pyqtgraph's 3D Graphics System
==============================
The 3D graphics system in pyqtgraph is composed of a :class:`view widget <pyqtgraph.opengl.GLViewWidget>` and
several graphics items (all subclasses of :class:`GLGraphicsItem <pyqtgraph.opengl.GLGraphicsItem>`) which
can be added to a view widget.
**Note:** use of this system requires python-opengl bindings. Linux users should install the python-opengl
packages from their distribution. Windows/OSX users can download from `<http://pyopengl.sourceforge.net>`_.
Contents:
.. toctree::
:maxdepth: 2
glviewwidget
glgriditem
glmeshitem
glvolumeitem
glaxisitem
glgraphicsitem
meshdata

View File

@ -0,0 +1,9 @@
MeshData
========
.. autoclass:: pyqtgraph.opengl.MeshData.MeshData
:members:
.. automethod:: pyqtgraph.opengl.MeshData.MeshData.__init__
.. automethod:: pyqtgraph.opengl.MeshData.MeshData.__iter__

View File

@ -9,4 +9,5 @@ Contents:
functions functions
graphicsItems/index graphicsItems/index
widgets/index widgets/index
graphicsscene/index 3dgraphics/index
graphicsscene/index

View File

@ -16,6 +16,7 @@ Contents:
how_to_use how_to_use
plotting plotting
images images
3dgraphics
style style
region_of_interest region_of_interest
parametertree parametertree

View File

@ -34,7 +34,7 @@ class PlotCurveItem(GraphicsObject):
sigPlotChanged = QtCore.Signal(object) sigPlotChanged = QtCore.Signal(object)
sigClicked = QtCore.Signal(object) sigClicked = QtCore.Signal(object)
def __init__(self, y=None, x=None, fillLevel=None, copy=False, pen=None, shadowPen=None, brush=None, parent=None, clickable=False): def __init__(self, x=None, y=None, fillLevel=None, copy=False, pen=None, shadowPen=None, brush=None, parent=None, clickable=False):
""" """
============== ======================================================= ============== =======================================================
**Arguments:** **Arguments:**

View File

@ -3,12 +3,13 @@ import pyqtgraph.functions as fn
class MeshData(object): class MeshData(object):
""" """
Class for storing 3D mesh data. May contain: Class for storing and operating on 3D mesh data. May contain:
- list of vertex locations
- list of edges - list of vertex locations
- list of triangles - list of edges
- colors per vertex, edge, or tri - list of triangles
- normals per vertex or tri - colors per vertex, edge, or tri
- normals per vertex or tri
""" """
def __init__(self): def __init__(self):
@ -26,11 +27,15 @@ class MeshData(object):
def setFaces(self, faces, vertexes=None): def setFaces(self, faces, vertexes=None):
""" """
Set the faces in this data set. Set the faces in this data set.
Data may be provided either as an Nx3x3 list of floats (9 float coordinate values per face) Data may be provided either as an Nx3x3 list of floats (9 float coordinate values per face)::
*faces* = [ [(x, y, z), (x, y, z), (x, y, z)], ... ]
or as an Nx3 list of ints (vertex integers) AND an Mx3 list of floats (3 float coordinate values per vertex) faces = [ [(x, y, z), (x, y, z), (x, y, z)], ... ]
*faces* = [ (p1, p2, p3), ... ]
*vertexes* = [ (x, y, z), ... ] or as an Nx3 list of ints (vertex integers) AND an Mx3 list of floats (3 float coordinate values per vertex)::
faces = [ (p1, p2, p3), ... ]
vertexes = [ (x, y, z), ... ]
""" """
if vertexes is None: if vertexes is None:
@ -147,18 +152,18 @@ class MeshData(object):
def edgeColors(self): def edgeColors(self):
return self._edgeColors return self._edgeColors
def reverseNormals(self): #def reverseNormals(self):
""" #"""
Reverses the direction of all normal vectors. #Reverses the direction of all normal vectors.
""" #"""
pass #pass
def generateEdgesFromFaces(self): #def generateEdgesFromFaces(self):
""" #"""
Generate a set of edges by listing all the edges of faces and removing any duplicates. #Generate a set of edges by listing all the edges of faces and removing any duplicates.
Useful for displaying wireframe meshes. #Useful for displaying wireframe meshes.
""" #"""
pass #pass
def save(self): def save(self):
"""Serialize this mesh to a string appropriate for disk storage""" """Serialize this mesh to a string appropriate for disk storage"""

View File

@ -5,6 +5,13 @@ from pyqtgraph import QtGui
__all__ = ['GLAxisItem'] __all__ = ['GLAxisItem']
class GLAxisItem(GLGraphicsItem): class GLAxisItem(GLGraphicsItem):
"""
**Bases:** :class:`GLGraphicsItem <pyqtgraph.opengl.GLGraphicsItem>`
Displays three lines indicating origin and orientation of local coordinate system.
"""
def __init__(self, size=None): def __init__(self, size=None):
GLGraphicsItem.__init__(self) GLGraphicsItem.__init__(self)
if size is None: if size is None:

View File

@ -6,6 +6,11 @@ import pyqtgraph as pg
__all__ = ['GLBoxItem'] __all__ = ['GLBoxItem']
class GLBoxItem(GLGraphicsItem): class GLBoxItem(GLGraphicsItem):
"""
**Bases:** :class:`GLGraphicsItem <pyqtgraph.opengl.GLGraphicsItem>`
Displays a wire-frame box.
"""
def __init__(self, size=None, color=None): def __init__(self, size=None, color=None):
GLGraphicsItem.__init__(self) GLGraphicsItem.__init__(self)
if size is None: if size is None:

View File

@ -5,6 +5,12 @@ from pyqtgraph import QtGui
__all__ = ['GLGridItem'] __all__ = ['GLGridItem']
class GLGridItem(GLGraphicsItem): class GLGridItem(GLGraphicsItem):
"""
**Bases:** :class:`GLGraphicsItem <pyqtgraph.opengl.GLGraphicsItem>`
Displays a wire-grame grid.
"""
def __init__(self, size=None, color=None): def __init__(self, size=None, color=None):
GLGraphicsItem.__init__(self) GLGraphicsItem.__init__(self)
if size is None: if size is None:

View File

@ -12,13 +12,13 @@ __all__ = ['GLMeshItem']
class GLMeshItem(GLGraphicsItem): class GLMeshItem(GLGraphicsItem):
""" """
Displays a 3D triangle mesh. **Bases:** :class:`GLGraphicsItem <pyqtgraph.opengl.GLGraphicsItem>`
Displays a 3D triangle mesh.
""" """
def __init__(self, faces, vertexes=None): def __init__(self, faces, vertexes=None):
""" """
See MeshData for initialization arguments. See :class:`MeshData <pyqtgraph.opengl.MeshData>` for initialization arguments.
""" """
if isinstance(faces, MeshData): if isinstance(faces, MeshData):
self.data = faces self.data = faces

View File

@ -6,7 +6,23 @@ import numpy as np
__all__ = ['GLVolumeItem'] __all__ = ['GLVolumeItem']
class GLVolumeItem(GLGraphicsItem): class GLVolumeItem(GLGraphicsItem):
"""
**Bases:** :class:`GLGraphicsItem <pyqtgraph.opengl.GLGraphicsItem>`
Displays volumetric data.
"""
def __init__(self, data, sliceDensity=1, smooth=True): def __init__(self, data, sliceDensity=1, smooth=True):
"""
============== =======================================================================================
**Arguments:**
data Volume data to be rendered. *Must* be 4D numpy array (x, y, z, RGBA) with dtype=ubyte.
sliceDensity Density of slices to render through the volume. A value of 1 means one slice per voxel.
smooth (bool) If True, the volume slices are rendered with linear interpolation
============== =======================================================================================
"""
self.sliceDensity = sliceDensity self.sliceDensity = sliceDensity
self.smooth = smooth self.smooth = smooth
self.data = data self.data = data