import numpy as np import trimesh import matplotlib.pyplot as plt #### # TODO: lift the dependency on fresnelvis # from salad.utils import nputil, thutil, fresnelvis from salad.utils import nputil, thutil #### from PIL import Image def render_pointcloud( pointcloud, camPos=np.array([-2, 2, -2]), camLookat=np.array([0.0, 0.0, 0.0]), camUp=np.array([0, 1, 0]), camHeight=2, resolution=(512, 512), samples=16, cloudR=0.006, ): pointcloud = thutil.th2np(pointcloud) img = fresnelvis.renderMeshCloud( cloud=pointcloud, camPos=camPos, camLookat=camLookat, camUp=camUp, camHeight=camHeight, resolution=resolution, samples=samples, cloudR=cloudR, ) return Image.fromarray(img) def render_mesh( vert, face, camPos=np.array([-2, 2, -2]), camLookat=np.array([0, 0, 0.0]), camUp=np.array([0, 1, 0]), camHeight=2, resolution=(512, 512), samples=16, ): vert, face = list(map(lambda x: thutil.th2np(x), [vert, face])) mesh = {"vert": vert, "face": face} img = fresnelvis.renderMeshCloud( mesh=mesh, camPos=camPos, camLookat=camLookat, camUp=camUp, camHeight=camHeight, resolution=resolution, samples=samples, ) return Image.fromarray(img) def render_gaussians( gaussians, is_bspnet=False, multiplier=1.0, gaussians_colors=None, attn_map=None, camPos=np.array([-2, 2, -2]), camLookat=np.array([0.0, 0, 0]), camUp=np.array([0, 1, 0]), camHeight=2, resolution=(512, 512), samples=16, ): gaussians = thutil.th2np(gaussians) N = gaussians.shape[0] cmap = plt.get_cmap("jet") if attn_map is not None: assert N == attn_map.shape[0] vmin, vmax = attn_map.min(), attn_map.max() if vmin == vmax: normalized_attn_map = np.zeros_like(attn_map) else: normalized_attn_map = (attn_map - vmin) / (vmax - vmin) cmap = plt.get_cmap("viridis") lights = "rembrandt" camera_kwargs = dict( camPos=camPos, camLookat=camLookat, camUp=camUp, camHeight=camHeight, resolution=resolution, samples=samples, ) renderer = fresnelvis.FresnelRenderer(lights=lights, camera_kwargs=camera_kwargs) for i, g in enumerate(gaussians): if is_bspnet: mu, eival, eivec = g[:3], g[3:6], g[6:15] else: mu, eivec, eival = g[:3], g[3:12], g[13:] R = eivec.reshape(3, 3).T scale = multiplier * np.sqrt(eival) scale_transform = np.diag((*scale, 1)) rigid_transform = np.hstack((R, mu.reshape(3, 1))) rigid_transform = np.vstack((rigid_transform, [0, 0, 0, 1])) sphere = trimesh.creation.icosphere() sphere.apply_transform(scale_transform) sphere.apply_transform(rigid_transform) if attn_map is None and gaussians_colors is None: color = np.array(cmap(i / N)[:3]) elif attn_map is not None: color = np.array(cmap(normalized_attn_map[i])[:3]) else: color = gaussians_colors[i] renderer.add_mesh( sphere.vertices, sphere.faces, color=color, outline_width=None ) image = renderer.render() return Image.fromarray(image)