1. """
  2. Simple script to convert ply to obj models
  3. """
  4. import os
  5. from argparse import ArgumentParser
  6.  
  7. from plyfile import PlyData
  8.  
  9. def parse_args():
  10. parser = ArgumentParser()
  11. parser.add_argument('ply_path')
  12. parser.add_argument('--obj_path', default=None, required=False)
  13.  
  14. args = parser.parse_args()
  15. return args.ply_path, args.obj_path
  16.  
  17. def ply_path_to_obj_path(ply_path):
  18. """
  19. Replaces the .ply extension with .obj extension
  20. """
  21. return os.path.splitext(ply_path)[0] + '.obj'
  22.  
  23. def convert(ply_path, obj_path=None):
  24. """
  25. Converts the given .ply file to an .obj file
  26. """
  27. obj_path = obj_path or ply_path_to_obj_path(ply_path)
  28. ply = PlyData.read(ply_path)
  29.  
  30. with open(obj_path, 'w') as f:
  31. f.write("# OBJ file\n")
  32.  
  33. verteces = ply['vertex']
  34.  
  35. for v in verteces:
  36. p = [v['x'], v['y'], v['z']]
  37. if 'red' in v and 'green' in v and 'blue' in v:
  38. c = [v['red'] / 256, v['green'] / 256, v['blue'] / 256]
  39. else:
  40. c = [0, 0, 0]
  41. a = p + c
  42. f.write("v %.6f %.6f %.6f %.6f %.6f %.6f \n" % tuple(a))
  43.  
  44. for v in verteces:
  45. if 'nx' in v and 'ny' in v and 'nz' in v:
  46. n = (v['nx'], v['ny'], v['nz'])
  47. f.write("vn %.6f %.6f %.6f\n" % n)
  48.  
  49. for v in verteces:
  50. if 's' in v and 't' in v:
  51. t = (v['s'], v['t'])
  52. f.write("vt %.6f %.6f\n" % t)
  53.  
  54. if 'face' in ply:
  55. for i in ply['face']['vertex_indices']:
  56. f.write("f")
  57. for j in range(i.size):
  58. # ii = [ i[j]+1 ]
  59. ii = [i[j] + 1, i[j] + 1, i[j] + 1]
  60. # f.write(" %d" % tuple(ii) )
  61. f.write(" %d/%d/%d" % tuple(ii))
  62. f.write("\n")
  63.  
  64. def main():
  65. ply_path, obj_path = parse_args()
  66. obj_path = ply_path_to_obj_path(ply_path)
  67. print(f"Converting {ply_path} to .obj...")
  68. convert(ply_path, obj_path)
  69. print(f"Conversion finished successfully. Output path: {obj_path}")
  70.  
  71. if __name__ == '__main__':
  72. main()

  

ply2obj的更多相关文章

随机推荐

  1. C++定义和初始化数组以及memset的使用(转)

    一.一维数组 静态 int array[100]; 定义了数组array,并未对数组进行初始化 静态 int array[100] = {1,2}: 定义并初始化了数组array 动态 int* ar ...

  2. js数组操作 求最大值,最小值,正序、倒叙大小值排序,去重复

    var arr = [1,5,2,56,12,34,21,3,5] Math.min.apply({},arr) Math.max.apply({},arr) arr.sort((m,n)=>m ...

  3. LeetCode 930. Binary Subarrays With Sum

    原题链接在这里:https://leetcode.com/problems/binary-subarrays-with-sum/ 题目: In an array A of 0s and 1s, how ...

  4. asp.net web开发——文件夹的上传和下载

    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...

  5. Building a Service Mesh with HAProxy and Consul

    转自:https://www.haproxy.com/blog/building-a-service-mesh-with-haproxy-and-consul/ HashiCorp added a s ...

  6. CSS块元素

    一.典型代表: Div h1-h6 p ul li 二.特点: 独占一行 可以设置宽高 嵌套(包含)下,子块元素宽度(没有定义情况下)和父块元素宽度默认一致. <style type=" ...

  7. Mysql 创建只读账户

    mysql 创建只读账户: 1.查询所有账号信息 SELECT DISTINCT a.`User`,a.`Host`,a.password_expired,a.password_last_change ...

  8. GoCN每日新闻(2019-10-02)

    GoCN每日新闻(2019-10-02) GoCN每日新闻(2019-10-02) 1. Golang中基于Gin和Casbin的web使用方式 https://dev.to/maxwellhertz ...

  9. git-中文乱码

    Windows系统的Git默认是不支持中文显示的,需要进行一系列的设置才能避免乱码的出现,下面总结如何配置Git使其支持中文显示. Git bash options UTF-8编码配置 1.首先进入g ...

  10. Linux 备份工具dump

    dump的功能很强,除了可以备份整个文件外,还能够针对目录来备份,还可以指定等级.什么意思呢?假设你的/home是独立的一个 文件系统,那你第一次进行过dump后,再进行第二次dump时,可以指定不同 ...