| 296 | return img_points |
| 297 | |
| 298 | class Renderer(): |
| 299 | |
| 300 | def __init__(self, principal_point=None, img_size=None, cam_intrinsic = None): |
| 301 | |
| 302 | super().__init__() |
| 303 | |
| 304 | self.device = torch.device("cuda:0") |
| 305 | torch.cuda.set_device(self.device) |
| 306 | self.cam_intrinsic = cam_intrinsic |
| 307 | self.image_size = img_size |
| 308 | self.render_img_size = np.max(img_size) |
| 309 | |
| 310 | principal_point = [-(self.cam_intrinsic[0,2]-self.image_size[1]/2.)/(self.image_size[1]/2.), -(self.cam_intrinsic[1,2]-self.image_size[0]/2.)/(self.image_size[0]/2.)] |
| 311 | self.principal_point = torch.tensor(principal_point, device=self.device).unsqueeze(0) |
| 312 | |
| 313 | self.cam_R = torch.from_numpy(np.array([[-1., 0., 0.], |
| 314 | [0., -1., 0.], |
| 315 | [0., 0., 1.]])).cuda().float().unsqueeze(0) |
| 316 | |
| 317 | self.cam_T = torch.zeros((1,3)).cuda().float() |
| 318 | |
| 319 | half_max_length = max(self.cam_intrinsic[0:2,2]) |
| 320 | self.focal_length = torch.tensor([(self.cam_intrinsic[0,0]/half_max_length).astype(np.float32), \ |
| 321 | (self.cam_intrinsic[1,1]/half_max_length).astype(np.float32)]).unsqueeze(0) |
| 322 | |
| 323 | self.cameras = SfMPerspectiveCameras(focal_length=self.focal_length, principal_point=self.principal_point, R=self.cam_R, T=self.cam_T, device=self.device) |
| 324 | |
| 325 | self.lights = PointLights(device=self.device,location=[[0.0, 0.0, 0.0]], ambient_color=((1,1,1),),diffuse_color=((0,0,0),),specular_color=((0,0,0),)) |
| 326 | |
| 327 | self.raster_settings = RasterizationSettings(image_size=self.render_img_size, faces_per_pixel=10, blur_radius=0, max_faces_per_bin=30000) |
| 328 | self.rasterizer = MeshRasterizer(cameras=self.cameras, raster_settings=self.raster_settings) |
| 329 | |
| 330 | self.shader = SoftPhongShader(device=self.device, cameras=self.cameras, lights=self.lights) |
| 331 | |
| 332 | self.renderer = MeshRenderer(rasterizer=self.rasterizer, shader=self.shader) |
| 333 | |
| 334 | def set_camera(self, R, T): |
| 335 | self.cam_R = R |
| 336 | self.cam_T = T |
| 337 | self.cam_R[:, :2, :] *= -1.0 |
| 338 | self.cam_T[:, :2] *= -1.0 |
| 339 | self.cam_R = torch.transpose(self.cam_R,1,2) |
| 340 | self.cameras = SfMPerspectiveCameras(focal_length=self.focal_length, principal_point=self.principal_point, R=self.cam_R, T=self.cam_T, device=self.device) |
| 341 | self.rasterizer = MeshRasterizer(cameras=self.cameras, raster_settings=self.raster_settings) |
| 342 | self.shader = SoftPhongShader(device=self.device, cameras=self.cameras, lights=self.lights) |
| 343 | self.renderer = MeshRenderer(rasterizer=self.rasterizer, shader=self.shader) |
| 344 | |
| 345 | def render_mesh_recon(self, verts, faces, R=None, T=None, colors=None, mode='npat'): |
| 346 | ''' |
| 347 | mode: normal, phong, texture |
| 348 | ''' |
| 349 | with torch.no_grad(): |
| 350 | |
| 351 | mesh = Meshes(verts, faces) |
| 352 | |
| 353 | normals = torch.stack(mesh.verts_normals_list()) |
| 354 | front_light = -torch.tensor([0,0,-1]).float().to(verts.device) |
| 355 | shades = (normals * front_light.view(1,1,3)).sum(-1).clamp(min=0).unsqueeze(-1).expand(-1,-1,3) |