Spaces:
Sleeping
Sleeping
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) | |