|
|
''' io: read&write mesh |
|
|
1. read obj as array(TODO) |
|
|
2. write arrays to obj |
|
|
|
|
|
Preparation knowledge: |
|
|
representations of 3d face: mesh, point cloud... |
|
|
storage format: obj, ply, bin, asc, mat... |
|
|
''' |
|
|
|
|
|
from __future__ import absolute_import |
|
|
from __future__ import division |
|
|
from __future__ import print_function |
|
|
|
|
|
import numpy as np |
|
|
import os |
|
|
from skimage import io |
|
|
|
|
|
|
|
|
|
|
|
def read_obj(obj_name): |
|
|
''' read mesh |
|
|
''' |
|
|
return 0 |
|
|
|
|
|
|
|
|
def write_asc(path, vertices): |
|
|
''' |
|
|
Args: |
|
|
vertices: shape = (nver, 3) |
|
|
''' |
|
|
if path.split('.')[-1] == 'asc': |
|
|
np.savetxt(path, vertices) |
|
|
else: |
|
|
np.savetxt(path + '.asc', vertices) |
|
|
|
|
|
def write_obj_with_colors(obj_name, vertices, triangles, colors): |
|
|
''' Save 3D face model with texture represented by colors. |
|
|
Args: |
|
|
obj_name: str |
|
|
vertices: shape = (nver, 3) |
|
|
triangles: shape = (ntri, 3) |
|
|
colors: shape = (nver, 3) |
|
|
''' |
|
|
triangles = triangles.copy() |
|
|
triangles += 1 |
|
|
|
|
|
if obj_name.split('.')[-1] != 'obj': |
|
|
obj_name = obj_name + '.obj' |
|
|
|
|
|
|
|
|
with open(obj_name, 'w') as f: |
|
|
|
|
|
|
|
|
for i in range(vertices.shape[0]): |
|
|
|
|
|
s = 'v {} {} {} {} {} {}\n'.format(vertices[i, 0], vertices[i, 1], vertices[i, 2], colors[i, 0], colors[i, 1], colors[i, 2]) |
|
|
f.write(s) |
|
|
|
|
|
|
|
|
[k, ntri] = triangles.shape |
|
|
for i in range(triangles.shape[0]): |
|
|
|
|
|
s = 'f {} {} {}\n'.format(triangles[i, 2], triangles[i, 1], triangles[i, 0]) |
|
|
f.write(s) |
|
|
|
|
|
|
|
|
def write_obj_with_texture(obj_name, vertices, triangles, texture, uv_coords): |
|
|
''' Save 3D face model with texture represented by texture map. |
|
|
Ref: https://github.com/patrikhuber/eos/blob/bd00155ebae4b1a13b08bf5a991694d682abbada/include/eos/core/Mesh.hpp |
|
|
Args: |
|
|
obj_name: str |
|
|
vertices: shape = (nver, 3) |
|
|
triangles: shape = (ntri, 3) |
|
|
texture: shape = (256,256,3) |
|
|
uv_coords: shape = (nver, 3) max value<=1 |
|
|
''' |
|
|
if obj_name.split('.')[-1] != 'obj': |
|
|
obj_name = obj_name + '.obj' |
|
|
mtl_name = obj_name.replace('.obj', '.mtl') |
|
|
texture_name = obj_name.replace('.obj', '_texture.png') |
|
|
|
|
|
triangles = triangles.copy() |
|
|
triangles += 1 |
|
|
|
|
|
|
|
|
with open(obj_name, 'w') as f: |
|
|
|
|
|
s = "mtllib {}\n".format(os.path.abspath(mtl_name)) |
|
|
f.write(s) |
|
|
|
|
|
|
|
|
for i in range(vertices.shape[0]): |
|
|
s = 'v {} {} {}\n'.format(vertices[i, 0], vertices[i, 1], vertices[i, 2]) |
|
|
f.write(s) |
|
|
|
|
|
|
|
|
for i in range(uv_coords.shape[0]): |
|
|
|
|
|
s = 'vt {} {}\n'.format(uv_coords[i,0], uv_coords[i,1]) |
|
|
f.write(s) |
|
|
|
|
|
f.write("usemtl FaceTexture\n") |
|
|
|
|
|
|
|
|
for i in range(triangles.shape[0]): |
|
|
s = 'f {}/{} {}/{} {}/{}\n'.format(triangles[i,2], triangles[i,2], triangles[i,1], triangles[i,1], triangles[i,0], triangles[i,0]) |
|
|
f.write(s) |
|
|
|
|
|
|
|
|
with open(mtl_name, 'w') as f: |
|
|
f.write("newmtl FaceTexture\n") |
|
|
s = 'map_Kd {}\n'.format(os.path.abspath(texture_name)) |
|
|
f.write(s) |
|
|
|
|
|
|
|
|
imsave(texture_name, texture) |
|
|
|
|
|
|
|
|
def write_obj_with_colors_texture(obj_name, vertices, triangles, colors, texture, uv_coords): |
|
|
''' Save 3D face model with texture. |
|
|
Ref: https://github.com/patrikhuber/eos/blob/bd00155ebae4b1a13b08bf5a991694d682abbada/include/eos/core/Mesh.hpp |
|
|
Args: |
|
|
obj_name: str |
|
|
vertices: shape = (nver, 3) |
|
|
triangles: shape = (ntri, 3) |
|
|
colors: shape = (nver, 3) |
|
|
texture: shape = (256,256,3) |
|
|
uv_coords: shape = (nver, 3) max value<=1 |
|
|
''' |
|
|
if obj_name.split('.')[-1] != 'obj': |
|
|
obj_name = obj_name + '.obj' |
|
|
mtl_name = obj_name.replace('.obj', '.mtl') |
|
|
texture_name = obj_name.replace('.obj', '_texture.png') |
|
|
|
|
|
triangles = triangles.copy() |
|
|
triangles += 1 |
|
|
|
|
|
|
|
|
with open(obj_name, 'w') as f: |
|
|
|
|
|
s = "mtllib {}\n".format(os.path.abspath(mtl_name)) |
|
|
f.write(s) |
|
|
|
|
|
|
|
|
for i in range(vertices.shape[0]): |
|
|
s = 'v {} {} {} {} {} {}\n'.format(vertices[i, 0], vertices[i, 1], vertices[i, 2], colors[i, 0], colors[i, 1], colors[i, 2]) |
|
|
f.write(s) |
|
|
|
|
|
|
|
|
for i in range(uv_coords.shape[0]): |
|
|
|
|
|
s = 'vt {} {}\n'.format(uv_coords[i,0], uv_coords[i,1]) |
|
|
f.write(s) |
|
|
|
|
|
f.write("usemtl FaceTexture\n") |
|
|
|
|
|
|
|
|
for i in range(triangles.shape[0]): |
|
|
|
|
|
s = 'f {}/{} {}/{} {}/{}\n'.format(triangles[i,2], triangles[i,2], triangles[i,1], triangles[i,1], triangles[i,0], triangles[i,0]) |
|
|
f.write(s) |
|
|
|
|
|
|
|
|
with open(mtl_name, 'w') as f: |
|
|
f.write("newmtl FaceTexture\n") |
|
|
s = 'map_Kd {}\n'.format(os.path.abspath(texture_name)) |
|
|
f.write(s) |
|
|
|
|
|
|
|
|
io.imsave(texture_name, texture) |