| 143 | |
| 144 | @torch.no_grad() |
| 145 | def marching_cubes(self, voxels, sdf): |
| 146 | voxels = voxels[:, :3] # (num_voxels,3) |
| 147 | sdf = sdf[..., 0] # extract sdf |
| 148 | res = 1.0 / (sdf.shape[1] - 1) # 1/(8-1) |
| 149 | spacing = [res, res, res] |
| 150 | |
| 151 | num_verts = 0 |
| 152 | total_verts = [] |
| 153 | total_faces = [] |
| 154 | for i in range(len(voxels)): |
| 155 | sdf_volume = sdf[i].detach().cpu().numpy() # (res,res,res) |
| 156 | if np.min(sdf_volume) > 0 or np.max(sdf_volume) < 0: |
| 157 | continue |
| 158 | try: |
| 159 | verts, faces, _, _ = marching_cubes(sdf_volume, 0, spacing=spacing) |
| 160 | except: |
| 161 | continue |
| 162 | verts -= 0.5 |
| 163 | verts *= self.voxel_size |
| 164 | verts += voxels[i].detach().cpu().numpy() |
| 165 | faces += num_verts |
| 166 | num_verts += verts.shape[0] |
| 167 | |
| 168 | total_verts += [verts] |
| 169 | total_faces += [faces] |
| 170 | total_verts = np.concatenate(total_verts) |
| 171 | total_faces = np.concatenate(total_faces) |
| 172 | return total_verts, total_faces |