from typing import List, Set, Dict, Tuple, Optional import numpy as np import trimesh import pyrender def render_model( scene, model, model_out, **kwargs ): return render_model_geometry( scene=scene, faces=model.faces, vertices=model_out.vertices.detach().cpu().numpy().squeeze(), **kwargs ) def render_model_geometry( scene, faces, vertices, color=[1.0, 0.3, 0.3, 0.8], name=None, pose=None ): # set vertex colors, maybe use this to highlight accuracies vertex_colors = np.ones([vertices.shape[0], 4]) * color # triangulate vertex mesh tri_mesh = trimesh.Trimesh(vertices, faces, vertex_colors=vertex_colors) mesh = pyrender.Mesh.from_trimesh(tri_mesh) return scene.add(mesh, name=name, pose=pose) def render_points(scene, points, radius=0.005, color=[0.0, 0.0, 1.0, 1.0], name=None, transform=None): sm = trimesh.creation.uv_sphere(radius=radius) sm.visual.vertex_colors = color tfs = np.tile(np.eye(4), (len(points), 1, 1)) tfs[:, :3, 3] = points if transform is not None: tfs = transform @ tfs pcl = pyrender.Mesh.from_trimesh(sm, poses=tfs) # return the render scene node return scene.add(pcl, name=name) def render_camera(scene, radius=0.5, height=0.5, color=[0.0, 0.0, 1.0, 1.0], name=None): sm = trimesh.creation.cone(radius, height, sections=None, transform=None) sm.visual.vertex_colors = color tfs = np.eye(4) pcl = pyrender.Mesh.from_trimesh(sm, poses=tfs) # return the render scene node return scene.add(pcl, name=name) def render_image_plane(scene, image, scale, name=None): height, width, _ = image.shape mat = trimesh.visual.texture.TextureVisuals( image=image, uv=[[0, 0], [0, 1], [1, 0], [1, 1]]) tm = trimesh.load('plane.obj', visual=mat) tm.visual = mat tfs = np.eye(4) tfs[0, 0] = width / height * scale tfs[1, 1] *= scale tfs[2, 2] *= scale tfs[0, 3] = (width / height - 1) * scale material2 = pyrender.Material(name=name, emissiveTexture=image) m = pyrender.Mesh.from_trimesh(tm, poses=tfs) return scene.add(m, name=name)