zoukankan      html  css  js  c++  java
  • 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()
    

      

  • 相关阅读:
    你所不知道的React Hooks
    DataRow的RowState属性变化
    gRPC详解
    Protobuf简明教程
    docker容器内没有权限
    Locust高并发情况下的性能优化与分布式场景的应用
    Docker容器日志打满机器的解决方式
    Django单测详解
    使用Flask+uwsgi+Nginx部署Flask正式环境
    Locust-分布式执行
  • 原文地址:https://www.cnblogs.com/BambooEatPanda/p/10973120.html
Copyright © 2011-2022 走看看