| import torch
|
| from easydict import EasyDict as edict
|
| from ..representations import Voxel
|
| from easydict import EasyDict as edict
|
|
|
|
|
| class VoxelRenderer:
|
| """
|
| Renderer for the Voxel representation.
|
|
|
| Args:
|
| rendering_options (dict): Rendering options.
|
| """
|
|
|
| def __init__(self, rendering_options={}) -> None:
|
| self.rendering_options = edict({
|
| "resolution": None,
|
| "near": 0.1,
|
| "far": 10.0,
|
| "ssaa": 1,
|
| })
|
| self.rendering_options.update(rendering_options)
|
|
|
| def render(
|
| self,
|
| voxel: Voxel,
|
| extrinsics: torch.Tensor,
|
| intrinsics: torch.Tensor,
|
| colors_overwrite: torch.Tensor = None
|
| ) -> edict:
|
| """
|
| Render the gausssian.
|
|
|
| Args:
|
| voxel (Voxel): Voxel representation.
|
| extrinsics (torch.Tensor): (4, 4) camera extrinsics
|
| intrinsics (torch.Tensor): (3, 3) camera intrinsics
|
| colors_overwrite (torch.Tensor): (N, 3) override color
|
|
|
| Returns:
|
| edict containing:
|
| color (torch.Tensor): (3, H, W) rendered color image
|
| depth (torch.Tensor): (H, W) rendered depth
|
| alpha (torch.Tensor): (H, W) rendered alpha
|
| ...
|
| """
|
|
|
| if 'o_voxel' not in globals():
|
| import o_voxel
|
| renderer = o_voxel.rasterize.VoxelRenderer(self.rendering_options)
|
| positions = voxel.position
|
| attrs = voxel.attrs if colors_overwrite is None else colors_overwrite
|
| voxel_size = voxel.voxel_size
|
|
|
|
|
| render_ret = renderer.render(positions, attrs, voxel_size, extrinsics, intrinsics)
|
|
|
| ret = {
|
| 'depth': render_ret['depth'],
|
| 'alpha': render_ret['alpha'],
|
| }
|
| if colors_overwrite is not None:
|
| ret['color'] = render_ret['attr']
|
| else:
|
| for k, s in voxel.layout.items():
|
| ret[k] = render_ret['attr'][s]
|
|
|
| return ret
|
|
|