Skip to content

Instantly share code, notes, and snippets.

@gpiantoni
Created September 3, 2015 16:03
Show Gist options
  • Select an option

  • Save gpiantoni/0a83fb32cf91ecc8b4bb to your computer and use it in GitHub Desktop.

Select an option

Save gpiantoni/0a83fb32cf91ecc8b4bb to your computer and use it in GitHub Desktop.
3D mesh rendering in vispy
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)
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