Save 3D face model with texture. borrowed from https://github.com/YadiraF/PRNet/blob/master/utils/write.py Args: obj_name: str vertices: shape = (nver, 3) colors: shape = (nver, 3) faces: shape = (ntri, 3) texture: shape = (uv_size, uv_size, 3)
(obj_name,
vertices,
faces,
colors=None,
texture=None,
uvcoords=None,
uvfaces=None,
inverse_face_order=False,
normal_map=None,
)
| 451 | dict[k] = v.to(device) |
| 452 | |
| 453 | def write_obj(obj_name, |
| 454 | vertices, |
| 455 | faces, |
| 456 | colors=None, |
| 457 | texture=None, |
| 458 | uvcoords=None, |
| 459 | uvfaces=None, |
| 460 | inverse_face_order=False, |
| 461 | normal_map=None, |
| 462 | ): |
| 463 | ''' Save 3D face model with texture. |
| 464 | borrowed from https://github.com/YadiraF/PRNet/blob/master/utils/write.py |
| 465 | Args: |
| 466 | obj_name: str |
| 467 | vertices: shape = (nver, 3) |
| 468 | colors: shape = (nver, 3) |
| 469 | faces: shape = (ntri, 3) |
| 470 | texture: shape = (uv_size, uv_size, 3) |
| 471 | uvcoords: shape = (nver, 2) max value<=1 |
| 472 | ''' |
| 473 | if obj_name.split('.')[-1] != 'obj': |
| 474 | obj_name = obj_name + '.obj' |
| 475 | mtl_name = obj_name.replace('.obj', '.mtl') |
| 476 | texture_name = obj_name.replace('.obj', '.png') |
| 477 | material_name = 'FaceTexture' |
| 478 | |
| 479 | faces = faces.copy() |
| 480 | # mesh lab start with 1, python/c++ start from 0 |
| 481 | faces += 1 |
| 482 | if inverse_face_order: |
| 483 | faces = faces[:, [2, 1, 0]] |
| 484 | if uvfaces is not None: |
| 485 | uvfaces = uvfaces[:, [2, 1, 0]] |
| 486 | |
| 487 | # write obj |
| 488 | with open(obj_name, 'w') as f: |
| 489 | if texture is not None: |
| 490 | f.write('mtllib %s\n\n' % os.path.basename(mtl_name)) |
| 491 | |
| 492 | # write vertices |
| 493 | if colors is None: |
| 494 | for i in range(vertices.shape[0]): |
| 495 | f.write('v {} {} {}\n'.format(vertices[i, 0], vertices[i, 1], vertices[i, 2])) |
| 496 | else: |
| 497 | for i in range(vertices.shape[0]): |
| 498 | f.write('v {} {} {} {} {} {}\n'.format(vertices[i, 0], vertices[i, 1], vertices[i, 2], colors[i, 0], colors[i, 1], colors[i, 2])) |
| 499 | |
| 500 | # write uv coords |
| 501 | if texture is None: |
| 502 | for i in range(faces.shape[0]): |
| 503 | f.write('f {} {} {}\n'.format(faces[i, 0], faces[i, 1], faces[i, 2])) |
| 504 | else: |
| 505 | for i in range(uvcoords.shape[0]): |
| 506 | f.write('vt {} {}\n'.format(uvcoords[i,0], uvcoords[i,1])) |
| 507 | f.write('usemtl %s\n' % material_name) |
| 508 | # write f: ver ind/ uv ind |
| 509 | uvfaces = uvfaces + 1 |
| 510 | for i in range(faces.shape[0]): |