Spaces:
Runtime error
Runtime error
| .. _model_guide: | |
| Loading and Configuring Models | |
| ============================== | |
| The first step to any rendering application is loading your models. | |
| Pyrender implements the GLTF 2.0 specification, which means that all | |
| models are composed of a hierarchy of objects. | |
| At the top level, we have a :class:`.Mesh`. The :class:`.Mesh` is | |
| basically a wrapper of any number of :class:`.Primitive` types, | |
| which actually represent geometry that can be drawn to the screen. | |
| Primitives are composed of a variety of parameters, including | |
| vertex positions, vertex normals, color and texture information, | |
| and triangle indices if smooth rendering is desired. | |
| They can implement point clouds, triangular meshes, or lines | |
| depending on how you configure their data and set their | |
| parameter. | |
| Although you can create primitives yourself if you want to, | |
| it's probably easier to just use the utility functions provided | |
| in the :class:`.Mesh` class. | |
| Creating Triangular Meshes | |
| -------------------------- | |
| Simple Construction | |
| ~~~~~~~~~~~~~~~~~~~ | |
| Pyrender allows you to create a :class:`.Mesh` containing a | |
| triangular mesh model directly from a :class:`~trimesh.base.Trimesh` object | |
| using the :meth:`.Mesh.from_trimesh` static method. | |
| >>> import trimesh | |
| >>> import pyrender | |
| >>> import numpy as np | |
| >>> tm = trimesh.load('examples/models/fuze.obj') | |
| >>> m = pyrender.Mesh.from_trimesh(tm) | |
| >>> m.primitives | |
| You can also create a single :class:`.Mesh` from a list of | |
| objects: | |
| >>> tms = [trimesh.creation.icosahedron(), trimesh.creation.cylinder()] | |
| >>> m = pyrender.Mesh.from_trimesh(tms) | |
| [<pyrender.primitive.Primitive at 0x7fbb0c2b74d0>, | |
| <pyrender.primitive.Primitive at 0x7fbb0c2b7550>] | |
| Vertex Smoothing | |
| ~~~~~~~~~~~~~~~~ | |
| The :meth:`.Mesh.from_trimesh` method has a few additional optional parameters. | |
| If you want to render the mesh without interpolating face normals, which can | |
| be useful for meshes that are supposed to be angular (e.g. a cube), you | |
| can specify ``smooth=False``. | |
| >>> m = pyrender.Mesh.from_trimesh(tm, smooth=False) | |
| Per-Face or Per-Vertex Coloration | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| If you have an untextured trimesh, you can color it in with per-face or | |
| per-vertex colors: | |
| >>> tm.visual.vertex_colors = np.random.uniform(size=tm.vertices.shape) | |
| >>> tm.visual.face_colors = np.random.uniform(size=tm.faces.shape) | |
| >>> m = pyrender.Mesh.from_trimesh(tm) | |
| Instancing | |
| ~~~~~~~~~~ | |
| If you want to render many copies of the same mesh at different poses, | |
| you can statically create a vast array of them in an efficient manner. | |
| Simply specify the ``poses`` parameter to be a list of ``N`` 4x4 homogenous | |
| transformation matrics that position the meshes relative to their common | |
| base frame: | |
| >>> tfs = np.tile(np.eye(4), (3,1,1)) | |
| >>> tfs[1,:3,3] = [0.1, 0.0, 0.0] | |
| >>> tfs[2,:3,3] = [0.2, 0.0, 0.0] | |
| >>> tfs | |
| array([[[1. , 0. , 0. , 0. ], | |
| [0. , 1. , 0. , 0. ], | |
| [0. , 0. , 1. , 0. ], | |
| [0. , 0. , 0. , 1. ]], | |
| [[1. , 0. , 0. , 0.1], | |
| [0. , 1. , 0. , 0. ], | |
| [0. , 0. , 1. , 0. ], | |
| [0. , 0. , 0. , 1. ]], | |
| [[1. , 0. , 0. , 0.2], | |
| [0. , 1. , 0. , 0. ], | |
| [0. , 0. , 1. , 0. ], | |
| [0. , 0. , 0. , 1. ]]]) | |
| >>> m = pyrender.Mesh.from_trimesh(tm, poses=tfs) | |
| Custom Materials | |
| ~~~~~~~~~~~~~~~~ | |
| You can also specify a custom material for any triangular mesh you create | |
| in the ``material`` parameter of :meth:`.Mesh.from_trimesh`. | |
| The main material supported by Pyrender is the | |
| The metallic-roughness model supports rendering highly-realistic objects across | |
| a wide gamut of materials. | |
| For more information, see the documentation of the | |
| constructor or look at the Khronos_ | |
| documentation for more information. | |
| .. _Khronos: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#materials | |
| Creating Point Clouds | |
| --------------------- | |
| Point Sprites | |
| ~~~~~~~~~~~~~ | |
| Pyrender also allows you to create a :class:`.Mesh` containing a | |
| point cloud directly from :class:`numpy.ndarray` instances | |
| using the :meth:`.Mesh.from_points` static method. | |
| Simply provide a list of points and optional per-point colors and normals. | |
| >>> pts = tm.vertices.copy() | |
| >>> colors = np.random.uniform(size=pts.shape) | |
| >>> m = pyrender.Mesh.from_points(pts, colors=colors) | |
| Point clouds created in this way will be rendered as square point sprites. | |
| .. image:: /_static/points.png | |
| Point Spheres | |
| ~~~~~~~~~~~~~ | |
| If you have a monochromatic point cloud and would like to render it with | |
| spheres, you can render it by instancing a spherical trimesh: | |
| >>> sm = trimesh.creation.uv_sphere(radius=0.1) | |
| >>> sm.visual.vertex_colors = [1.0, 0.0, 0.0] | |
| >>> tfs = np.tile(np.eye(4), (len(pts), 1, 1)) | |
| >>> tfs[:,:3,3] = pts | |
| >>> m = pyrender.Mesh.from_trimesh(sm, poses=tfs) | |
| .. image:: /_static/points2.png | |