.obj 到法线的原始顶点转换器 python
.obj to raw vertices converter with normals in python
我再次请求您的帮助。我想用 python 制作一个脚本,该脚本采用顶点和法线的 .obj 格式文件,并导出 2 个具有顶点坐标的文件和另一个具有法线
的法线坐标的文件
v 1.900470 2.777519 -1.000000
v 1.900470 2.777519 -3.000000
v 2.095561 2.796734 -1.000000
v 2.095560 2.796734 -3.000000
v 2.283154 2.853640 -1.000000
v 2.283154 2.853640 -3.000000
v 2.456040 2.946049 -1.000000
v 2.456040 2.946049 -3.000000
v 2.607577 3.070412 -1.000000
vn 0.0980 -0.9952 0.0000
vn 0.2903 -0.9569 -0.0000
vn 0.4714 -0.8819 0.0000
f 2//1 3//1 1//1
f 4//2 5//2 3//2
f 6//3 7//3 5//3
并以以下格式导出:
广告
verxex1.x,verxex1.y,verxex1.z, verxex2.x,verxex2.y,verxex2.z,verxex3.x,verxex3.y,verxex3.z,
法线:
normal1.x,normal1.y,normal1.z, normal2.x,normal2.y,normal2.z, normal3.x,normal3.y,normal3.z,
随着面孔出现的顺序。希望我能得到一些示例代码,如果有人已经实现它以节省一些时间。
非常感谢!!
如果要解析 Wavefront .obj file, then the file can be parsed using a Regular Expression,它会获取包含相关数据的文件行:
import re
reComp = re.compile("(?<=^)(v |vn |vt |f )(.*)(?=$)", re.MULTILINE)
with open(filename) as f:
data = [txt.group() for txt in reComp.finditer(f.read())]
字符串列表可以转换为浮点坐标和属性列表以及整数索引:
v_arr, vn_arr, vt_arr, f_arr = [], [], [], []
for line in data:
tokens = line.split(' ')
if tokens[0] == 'v':
v_arr.append([float(c) for c in tokens[1:]])
elif tokens[0] == 'vn':
vn_arr.append([float(c) for c in tokens[1:]])
elif tokens[0] == 'vt':
vn_arr.append([float(c) for c in tokens[1:]])
elif tokens[0] == 'f':
f_arr.append([[int(i) if len(i) else 0 for i in c.split('/')] for c in tokens[1:]])
最终生成顶点坐标和法向量的线性列表:
vertices, normals = [], []
for face in f_arr:
for tp in face:
vertices += v_arr[tp[0]-1]
normals += vn_arr[tp[2]-1]
用上述代码解析题目的Wavefront文件,会生成如下顶点坐标和法向量数组:
顶点坐标:
[1.90047, 2.777519, -3.0, 2.095561, 2.796734, -1.0, 1.90047, 2.777519, -1.0, 2.09556, 2.796734, -3.0, 2.283154, 2.85364, -1.0, 2.095561, 2.796734, -1.0, 2.283154, 2.85364, -3.0, 2.45604, 2.946049, -1.0, 2.283154, 2.85364, -1.0]
法向量:
[0.098, -0.9952, 0.0, 0.098, -0.9952, 0.0, 0.098, -0.9952, 0.0, 0.2903, -0.9569, -0.0, 0.2903, -0.9569, -0.0, 0.2903, -0.9569, -0.0, 0.4714, -0.8819, 0.0, 0.4714, -0.8819, 0.0, 0.4714, -0.8819, 0.0]
我再次请求您的帮助。我想用 python 制作一个脚本,该脚本采用顶点和法线的 .obj 格式文件,并导出 2 个具有顶点坐标的文件和另一个具有法线
的法线坐标的文件v 1.900470 2.777519 -1.000000
v 1.900470 2.777519 -3.000000
v 2.095561 2.796734 -1.000000
v 2.095560 2.796734 -3.000000
v 2.283154 2.853640 -1.000000
v 2.283154 2.853640 -3.000000
v 2.456040 2.946049 -1.000000
v 2.456040 2.946049 -3.000000
v 2.607577 3.070412 -1.000000
vn 0.0980 -0.9952 0.0000
vn 0.2903 -0.9569 -0.0000
vn 0.4714 -0.8819 0.0000
f 2//1 3//1 1//1
f 4//2 5//2 3//2
f 6//3 7//3 5//3
并以以下格式导出:
广告
verxex1.x,verxex1.y,verxex1.z, verxex2.x,verxex2.y,verxex2.z,verxex3.x,verxex3.y,verxex3.z,
法线:
normal1.x,normal1.y,normal1.z, normal2.x,normal2.y,normal2.z, normal3.x,normal3.y,normal3.z,
随着面孔出现的顺序。希望我能得到一些示例代码,如果有人已经实现它以节省一些时间。
非常感谢!!
如果要解析 Wavefront .obj file, then the file can be parsed using a Regular Expression,它会获取包含相关数据的文件行:
import re
reComp = re.compile("(?<=^)(v |vn |vt |f )(.*)(?=$)", re.MULTILINE)
with open(filename) as f:
data = [txt.group() for txt in reComp.finditer(f.read())]
字符串列表可以转换为浮点坐标和属性列表以及整数索引:
v_arr, vn_arr, vt_arr, f_arr = [], [], [], []
for line in data:
tokens = line.split(' ')
if tokens[0] == 'v':
v_arr.append([float(c) for c in tokens[1:]])
elif tokens[0] == 'vn':
vn_arr.append([float(c) for c in tokens[1:]])
elif tokens[0] == 'vt':
vn_arr.append([float(c) for c in tokens[1:]])
elif tokens[0] == 'f':
f_arr.append([[int(i) if len(i) else 0 for i in c.split('/')] for c in tokens[1:]])
最终生成顶点坐标和法向量的线性列表:
vertices, normals = [], []
for face in f_arr:
for tp in face:
vertices += v_arr[tp[0]-1]
normals += vn_arr[tp[2]-1]
用上述代码解析题目的Wavefront文件,会生成如下顶点坐标和法向量数组:
顶点坐标:
[1.90047, 2.777519, -3.0, 2.095561, 2.796734, -1.0, 1.90047, 2.777519, -1.0, 2.09556, 2.796734, -3.0, 2.283154, 2.85364, -1.0, 2.095561, 2.796734, -1.0, 2.283154, 2.85364, -3.0, 2.45604, 2.946049, -1.0, 2.283154, 2.85364, -1.0]
法向量:
[0.098, -0.9952, 0.0, 0.098, -0.9952, 0.0, 0.098, -0.9952, 0.0, 0.2903, -0.9569, -0.0, 0.2903, -0.9569, -0.0, 0.2903, -0.9569, -0.0, 0.4714, -0.8819, 0.0, 0.4714, -0.8819, 0.0, 0.4714, -0.8819, 0.0]