• ply2obj


    """
    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
    ")
    
            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 
    " % 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)
    
            for v in verteces:
                if 's' in v and 't' in v:
                    t = (v['s'], v['t'])
                    f.write("vt %.6f %.6f
    " % 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("
    ")
    
    
    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()
    

      

  • 相关阅读:
    android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3
    display:inline-block的运用
    图解单片机8位PWM、16位PWM中“位”的含义!
    UVA10006
    [置顶] CF 86D Powerful array 分块算法入门,n*sqrt(n)
    俗人解释 三维渲染 在工作过程
    HDU 4414 Finding crosses(dfs)
    Codeforces 35E Parade 扫描线 + list
    hdu 4374 单调队列
    LeetCode OJ平台Sort Colors讨论主题算法
  • 原文地址:https://www.cnblogs.com/BambooEatPanda/p/10973120.html
Copyright © 2020-2023  润新知