-
-
Save assafrabin/ca110dba829dc960c48ad9ab90b8081e to your computer and use it in GitHub Desktop.
| """ | |
| Simple script to convert ply to obj models | |
| """ | |
| import os | |
| from argparse import ArgumentParser | |
| from plyfile import PlyData | |
| def parse_args(): | |
| parser = ArgumentParser() | |
| parser.add_argument('ply_path') | |
| parser.add_argument('--obj_path', default=None, required=False) | |
| args = parser.parse_args() | |
| return args.ply_path, args.obj_path | |
| def ply_path_to_obj_path(ply_path): | |
| """ | |
| Replaces the .ply extension with .obj extension | |
| """ | |
| return os.path.splitext(ply_path)[0] + '.obj' | |
| def convert(ply_path, obj_path=None): | |
| """ | |
| Converts the given .ply file to an .obj file | |
| """ | |
| obj_path = obj_path or ply_path_to_obj_path(ply_path) | |
| ply = PlyData.read(ply_path) | |
| with open(obj_path, 'w') as f: | |
| f.write("# OBJ file\n") | |
| verteces = ply['vertex'] | |
| for v in verteces: | |
| p = [v['x'], v['y'], v['z']] | |
| if 'red' in v and 'green' in v and 'blue' in v: | |
| c = [v['red'] / 256, v['green'] / 256, v['blue'] / 256] | |
| else: | |
| c = [0, 0, 0] | |
| a = p + c | |
| f.write("v %.6f %.6f %.6f %.6f %.6f %.6f \n" % tuple(a)) | |
| for v in verteces: | |
| if 'nx' in v and 'ny' in v and 'nz' in v: | |
| n = (v['nx'], v['ny'], v['nz']) | |
| f.write("vn %.6f %.6f %.6f\n" % n) | |
| for v in verteces: | |
| if 's' in v and 't' in v: | |
| t = (v['s'], v['t']) | |
| f.write("vt %.6f %.6f\n" % t) | |
| if 'face' in ply: | |
| for i in ply['face']['vertex_indices']: | |
| f.write("f") | |
| for j in range(i.size): | |
| # ii = [ i[j]+1 ] | |
| ii = [i[j] + 1, i[j] + 1, i[j] + 1] | |
| # f.write(" %d" % tuple(ii) ) | |
| f.write(" %d/%d/%d" % tuple(ii)) | |
| f.write("\n") | |
| def main(): | |
| ply_path, obj_path = parse_args() | |
| obj_path = ply_path_to_obj_path(ply_path) | |
| print(f"Converting {ply_path} to .obj...") | |
| convert(ply_path, obj_path) | |
| print(f"Conversion finished successfully. Output path: {obj_path}") | |
| if __name__ == '__main__': | |
| main() |
Honestly - I don't remember... I had some 3D project back then, but I left it.. Good Luck!
Traceback (most recent call last):
File "ply2obj.py", line 77, in
main()
File "ply2obj.py", line 72, in main
convert(ply_path, obj_path)
File "ply2obj.py", line 58, in convert
for i in ply['face']['vertex_indices']:
File "/Users/santhosh/Desktop/iisc/san/lib/python2.7/site-packages/plyfile.py", line 770, in getitem
return self.data[key]
ValueError: no field of name vertex_indices
@assafrabin can u please help me with the following issue
Honestly - I don't remember... I had some 3D project back then, but I left it.. Good Luck!
@santhu937
try to replace "ply['face']['vertex_indices']" with "ply['face']['vertex_index']"
maybe you can also check "ply['face']" to see what field of names it has
Hey, how to convert ply file with texture_uv (vertex texture) to obj file?