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的更多相关文章
随机推荐
- 神奇的 Object.defineProperty 解释说明
原文 : https://segmentfault.com/a/1190000004346467?utm_source=tuicool&utm_medium=referral 这个方法了不起啊 ...
- 讨论SQL语句中主副表之间的关系
在公司这么多些时间,自己在写SQL语句这方面的功夫实在是太差劲了,有时候自己写出来的SQL语句自己都不知道能不能使用,只是自己写出来的SQL语句是不报错的,但是,这对于真正意义上的SQL语句还差的真的 ...
- LeetCode 826. Most Profit Assigning Work
原题链接在这里:https://leetcode.com/problems/most-profit-assigning-work/ 题目: We have jobs: difficulty[i] is ...
- 001_keil仿真
(一)参考文献:STM32F4 MDK5软件仿真 error : no 'read' permission (二)转载: 问题描述 CPU:STM32F407MDK5软件模拟提示没有读写权限,只能一 ...
- Kali Linux 2019.4中文乱码解决
1.先换源deb http://mirrors.aliyun.com/kali kali-rolling main non-free contribdeb-src http://mirrors.ali ...
- asp.net Web 项目的文件/文件夹上传下载
以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传 ...
- 使用Sublime Text 写Processing
本来以为是个很简单的事情,没想到一波三折~ 1.下载Sublime Text 3(中文版)并且安装,没啥好说的 2.打开[工具 - 命令面板 - install package],接着就报错了 “Th ...
- CDH 版本 6.0.1 升级到 6.2.0 当前最新版本(CentOS 7.x)
前文「CDH CM版本 6.0.1 升级到 CM 6.2.0 当前最新版本(CentOS 7.x)」 承接上文,当我们完成 CM 6.2.0 的升级之后,我们已经相当于完成了80% minor 的升级 ...
- Gradle入门系列
http://blog.jobbole.com/71999/ 版权声明:本文为博主原创文章,未经博主允许不得转载.
- 日期时间格式的工具DateUtils整理
关于一些时间工具的处理 * 描述:此类用于取得当前日期相对应的月初,月末,季初,季末,年初,年末,返回值均为String字符串 * 1.得到当前日期 today() * 2.得到当前月份月初 this ...