def render_random_scene(self, camera_pose=None):
        """
          Renders a random view and return (pc, camera_pose, object_pose). 
          object_pose is None for single object per scene.
        """
        if camera_pose is None:
            viewing_index = np.random.randint(0, high=len(self.all_poses))
            camera_pose = self.all_poses[viewing_index]

        in_camera_pose = copy.deepcopy(camera_pose)
        _, _, pc, camera_pose = self.renderer.render(in_camera_pose)
        pc = self.apply_dropout(pc)
        pc = utils.regularize_pc_point_count(pc, self.opt.npoints)
        pc_mean = np.mean(pc, 0, keepdims=True)
        pc[:, :3] -= pc_mean[:, :3]
        camera_pose[:3, 3] -= pc_mean[0, :3]

        return pc, camera_pose, in_camera_pose
    def change_object_and_render(self,
                                 cad_path,
                                 cad_scale,
                                 camera_pose=None,
                                 thread_id=0):
        if camera_pose is None:
            viewing_index = np.random.randint(0, high=len(self.all_poses))
            camera_pose = self.all_poses[viewing_index]

        in_camera_pose = copy.deepcopy(camera_pose)
        _, _, pc, camera_pose = self.renderer.change_and_render(
            cad_path, cad_scale, in_camera_pose, thread_id)
        pc = self.apply_dropout(pc)
        pc = utils.regularize_pc_point_count(pc, self.opt.npoints)
        pc_mean = np.mean(pc, 0, keepdims=True)
        pc[:, :3] -= pc_mean[:, :3]
        camera_pose[:3, 3] -= pc_mean[0, :3]

        return pc, camera_pose, in_camera_pose