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的更多相关文章
随机推荐
- C++定义和初始化数组以及memset的使用(转)
一.一维数组 静态 int array[100]; 定义了数组array,并未对数组进行初始化 静态 int array[100] = {1,2}: 定义并初始化了数组array 动态 int* ar ...
- js数组操作 求最大值,最小值,正序、倒叙大小值排序,去重复
var arr = [1,5,2,56,12,34,21,3,5] Math.min.apply({},arr) Math.max.apply({},arr) arr.sort((m,n)=>m ...
- LeetCode 930. Binary Subarrays With Sum
原题链接在这里:https://leetcode.com/problems/binary-subarrays-with-sum/ 题目: In an array A of 0s and 1s, how ...
- asp.net web开发——文件夹的上传和下载
ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...
- Building a Service Mesh with HAProxy and Consul
转自:https://www.haproxy.com/blog/building-a-service-mesh-with-haproxy-and-consul/ HashiCorp added a s ...
- CSS块元素
一.典型代表: Div h1-h6 p ul li 二.特点: 独占一行 可以设置宽高 嵌套(包含)下,子块元素宽度(没有定义情况下)和父块元素宽度默认一致. <style type=" ...
- Mysql 创建只读账户
mysql 创建只读账户: 1.查询所有账号信息 SELECT DISTINCT a.`User`,a.`Host`,a.password_expired,a.password_last_change ...
- GoCN每日新闻(2019-10-02)
GoCN每日新闻(2019-10-02) GoCN每日新闻(2019-10-02) 1. Golang中基于Gin和Casbin的web使用方式 https://dev.to/maxwellhertz ...
- git-中文乱码
Windows系统的Git默认是不支持中文显示的,需要进行一系列的设置才能避免乱码的出现,下面总结如何配置Git使其支持中文显示. Git bash options UTF-8编码配置 1.首先进入g ...
- Linux 备份工具dump
dump的功能很强,除了可以备份整个文件外,还能够针对目录来备份,还可以指定等级.什么意思呢?假设你的/home是独立的一个 文件系统,那你第一次进行过dump后,再进行第二次dump时,可以指定不同 ...