Created
September 3, 2015 16:03
-
-
Save gpiantoni/0a83fb32cf91ecc8b4bb to your computer and use it in GitHub Desktop.
3D mesh rendering in vispy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from numpy import float32, load | |
| from vispy.geometry import MeshData | |
| from vispy.gloo import VertexBuffer | |
| from vispy.io.image import write_png | |
| from vispy.plot import Fig | |
| from vispy.scene.visuals import create_visual_node | |
| from vispy.visuals import Visual | |
| # download https://dl.dropboxusercontent.com/u/66601/fsaverage.npz | |
| surf = load('fsaverage.npz') | |
| vertex_shader = """ | |
| varying vec3 normal_vec; | |
| varying vec4 color_vec; | |
| void main() { | |
| normal_vec = $normal; | |
| color_vec = $color; | |
| gl_Position = $transform(vec4($position, 1)); | |
| } | |
| """ | |
| fragment_shader = """ | |
| varying vec3 normal_vec; | |
| varying vec4 color_vec; | |
| void main() { | |
| float p = dot(normal_vec, normalize(vec3($light_vec))); | |
| vec4 color = color_vec; | |
| color.rgb = color.rgb * (0.2 + 0.8 * abs(p)); | |
| gl_FragColor = color; | |
| } | |
| """ | |
| class SimpleMeshVisual(Visual): | |
| def __init__(self, meshdata, color=None, light_vec=(1, 0, 0)): | |
| Visual.__init__(self, vertex_shader, fragment_shader) | |
| v = meshdata.get_vertices(indexed='faces').astype(float32) | |
| self._vertices = VertexBuffer(v) | |
| v_norm = meshdata.get_vertex_normals(indexed='faces').astype(float32) | |
| self._normals = VertexBuffer(v_norm) | |
| self._colors = color | |
| self._light_vec = light_vec | |
| self._draw_mode = 'triangles' | |
| self.set_gl_state('opaque', depth_test=True, cull_face=True) | |
| def _prepare_transforms(self, view): | |
| view.view_program.vert['transform'] = view.get_transform() | |
| def _prepare_draw(self, view): | |
| self.shared_program.vert['position'] = self._vertices | |
| self.shared_program.vert['normal'] = self._normals | |
| self.shared_program.vert['color'] = self._colors | |
| self.shared_program.frag['light_vec'] = self._light_vec | |
| SimpleMesh = create_visual_node(SimpleMeshVisual) | |
| fig = Fig() | |
| plt = fig[0, 0] | |
| plt._configure_3d() | |
| SKIN_COLOR = 0.94, 0.82, 0.81, 1. | |
| meshdata = MeshData(vertices=surf['vert'], faces=surf['faces']) | |
| mesh = SimpleMesh(meshdata, color=SKIN_COLOR) | |
| plt.view.add(mesh) | |
| # remove white space around the main plot | |
| plt.grid.margin = 0 | |
| plt.title.stretch = 0, 0 | |
| plt.view.camera.center = (4, -18, 15) | |
| plt.view.camera.scale_factor = 135 | |
| plt.view.camera.elevation = 0 | |
| plt.view.camera.azimuth = 90 | |
| img = fig.render() | |
| write_png('rendered.png', img) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from numpy import load | |
| from vispy.geometry import MeshData | |
| from vispy.io.image import write_png | |
| from vispy.plot import Fig | |
| # download https://dl.dropboxusercontent.com/u/66601/fsaverage.npz | |
| surf = load('fsaverage.npz') | |
| meshdata = MeshData(vertices=surf['vert'], faces=surf['faces']) | |
| fig = Fig() | |
| plt = fig[0, 0] | |
| SKIN_COLOR = 0.94, 0.82, 0.81, 1. | |
| plt.mesh(meshdata=meshdata, color=SKIN_COLOR) | |
| plt.view.camera.center = (35, -18, 15) | |
| plt.view.camera.scale_factor = 128 | |
| plt.view.camera.elevation = 0 | |
| plt.view.camera.azimuth = 90 | |
| img = fig.render() | |
| write_png('rendered_default.png', img) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment