"""
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()

  

ply2obj的更多相关文章

随机推荐

  1. 聊聊rocketmq的ConsumeMode.CONCURRENTLY

    序 本文主要研究一下rocketmq的ConsumeMode.CONCURRENTLY ConsumeMode.CONCURRENTLY rocketmq-spring-boot-2.0.4-sour ...

  2. 01背包问题(dfs+剪枝)

    01背包问题 dfs解法 #include <iostream> #include <cstring> #include <algorithm> #include ...

  3. robot framework中如何为每个测试用例,测试集准备数据或销毁数据

    Suite Setup:在这个测试集的所有测试用例开始测试之前运行(类似于junit的@BeforeClass) Suite Teardown:在这个测试集的所有测试用例结束之后运行(类似于junit ...

  4. Python微信操控(itchat)

    itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单. 开源地址 https://github.com/littlecodersh/ItChat 文档: https://itc ...

  5. Boosting and AdaBoost

    Boosting是一种从一些弱分类器中创建一个强分类器的集成技术(提升算法). 它先由训练数据构建一个模型,然后创建第二个模型来尝试纠正第一个模型的错误.不断添加模型,直到训练集完美预测或已经添加到数 ...

  6. globing通配符

    匹配标点符号 linux中只要不含有/的文件就可以生成,所以标点符号也是符合要求的 匹配空白 使用\对空白进行转义,这样就可以生成包含空格名称的文件 但是不推荐这样用,容易让别人在使用的时候造成误解 ...

  7. 一次修复linux的efi引导的集中方法总结记录

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/grub_uefi_repair 起因:EFI分区被删除导致引导问 ...

  8. python下浏览器静默运行驱动

    此处以chromdriver为例,放置driver路径问题参看上一篇问题.和java处理差不多,python实现静默运行方式如下 首先解答为什么进行静默运行? 我们在本地一般便于调试可以用GUI界面运 ...

  9. Linux下的nexus数据迁移

    刚到公司没多久,目前公司有两个项目公用一个nexus的maven私服,现在想把两个私服的jar包拆分开: 我在原私服的nexus服务器中, 1.备份原nexus使用命令 完成tar包的压缩 打包完毕后 ...

  10. hdu1702 ACboy needs your help again![简单STL 栈 队列]

    目录 题目地址 题干 代码和解释 参考 题目地址 hdu1702 题干 代码和解释 本题很简单,只要掌握STL stack和STL vector的语法即可作答.记录本题是为了记录STL vector的 ...