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\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的更多相关文章
随机推荐
- LeetCode 708. Insert into a Cyclic Sorted List
原题链接在这里:https://leetcode.com/problems/insert-into-a-cyclic-sorted-list/ 题目: Given a node from a cycl ...
- Windbg命令脚本流程控制语句详解
在Windbg命令脚本一文里,我们介绍了命令脚本语言的的组成要素,在本文里将对语句进行展开的讲解.这些语句主要是流程控制的语句,比如我们常见的条件分子和循环语句等. ; (命令分隔符) 分号(:)字符 ...
- Educational Codeforces Round 67
Educational Codeforces Round 67 CF1187B Letters Shop 二分 https://codeforces.com/contest/1187/submissi ...
- 洛谷 P2085 最小函数值
目录 题目 思路 \(Code\) 题目 戳 思路 首先这些函数全部单带递增,因为\(a\),\(b\),\(c\)都是正整数. 我们将全部的函数的\(x\)为\(1\)时的函数值放入优先度列(小根堆 ...
- Generating a Random Sample from discrete probability distribution
If is a discrete random variable taking on values , then we can write . Implementation of this formu ...
- 【luoguP4544】[USACO10NOV]购买饲料Buying Feed
题目链接 首先把商店按坐标排序 \(dp_{i,j}\)表示前i个商店买了j吨饲料并运到终点的花费,二进制拆分优化转移 #include<algorithm> #include<io ...
- Android入门教程(八)
关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 今天讲讲安卓入门(八),讲讲Android的简介,如何搭建An ...
- (7)Go切片
切片 切片(Slice)是一个拥有相同类型元素的可变长度的序列.它是基于数组类型做的一层封装.它非常灵活,支持自动扩容. 切片是一个引用类型,它的内部结构包含地址.长度和容量.切片一般用于快速地操作一 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统-代码生成器用法
新的代码生成器比老的更加容易使用,要生成什么形式就选择什么形式,新的代码生成器采用的是WCF界面开发,同样采用开源的模式,根据自己使用习惯容易扩展 1.单列表模式 2.树形列表模式 3.左右列表模式 ...
- 蚂蚁Pincap头条
去年(18年)年底想出来看看机会,最后很幸运地拿到了 PingCAP,今日头条的 offer 以及蚂蚁金服的口头 offer.想着可以总结一下经验,分享一下自己这一段”骑驴找马”过的心路历程.当然,一 ...