方法1,meshlab,export mesh as
选择off格式。
方法2:obj转off
def obj2off(objpath, offpath):
'''
将obj文件转换为off文件
:param objpath: .obj文件的路径
:param offpath: .off文件的路径的保存地址
:return: 无
'''
line = ""
vset = []
fset = []
with open(objpath,'r') as f:
lines = f.readlines()
p = re.compile(r'/+')
space = re.compile(r' +')
for line in lines:
#拿到obj文件中一行,作为一个字符串
tailMark = " "
line = line+tailMark
if line[0]!='v' and line[0]!='f' :
continue
parameters = space.split(line.strip())
if parameters[0] == "v": #如果是顶点的话
Point = []
Point.append(eval( parameters[1]) )
Point.append(eval( parameters[2]) )
Point.append(eval( parameters[3]) )
vset.append(Point)
elif parameters[0] == "f": #如果是面的话,存放顶点的索引
vIndexSets = [] #临时存放点的集合
for i in range(1,len(parameters) ):
x = parameters[i]
ans = p.split(x)[0]
index = eval(ans)
index -= 1 #因为顶点索引在obj文件中是从1开始的,而我们存放的顶点是从0开始的,因此要减1
vIndexSets.append(index)
fset.append(vIndexSets)
with open(offpath, 'w') as out:
out = open(offpath, 'w')
out.write("OFF\n")
out.write(str(vset.__len__()) + " " + str(fset.__len__()) + " 0\n")
for j in range(len(vset)):
out.write(str(vset[j][0]) + " " + str(vset[j][1]) + " " + str(vset[j][2]) + "\n")
for i in range(len(fset)):
s = str(len( fset[i] ))
for j in range( len( fset[i] ) ):
s = s+ " "+ str(fset[i][j])
s += "\n"
out.write(s)
print("{} 转换成 {} 成功!".format( p.split(objpath)[-1], p.split(offpath)[-1] ))
stl转off格式:
import os
import re # 正则表达式
import time
start = time.clock() # 记录程序开始时间
with open('bunny.stl', 'r') as infile:
content = infile.read() # 将所有stl数据读到content中
reg = 'vertex (.*?)\n' # 正则
vertexs = re.findall(reg, content) # 保存所有在'vertexs'和回车之间的数据
print("未去重前的点个数:", len(vertexs))
s = sorted(set(vertexs), key=lambda x: (x)) # 排序,去除重复点
print("去除重复点后点个数:", len(s))
dic = {}
n = 0
for each in s: # 给字典中每个点添加键值
dic[each] = n
n = n + 1
outfile = open('bunny.off', 'w') # 打开保存文件
outfile.write('OFF' + '\n' + str(len(s)) + ' ' + str(len(vertexs) / 3) + ' ' + str(0) + '\n') # off文件开头
for each in s: # 保存所有的顶点
outfile.write(each + '\n')
k = 0
for f in vertexs: # 保存所有的面,每个面是三个点的键值
if k % 3 == 0:
outfile.write(str(3))
outfile.write(' ' + str(dic[f]))
if k % 3 == 2:
outfile.write('\n')
k = k + 1
outfile.close()
end = time.clock()
print("程序运行时间:%.03f" % (end - start))
os.system("pause")
1、Assimp
Open Asset Import是一个库,用于将各种3d文件格式加载为共享的内存格式。它支持40多种用于导入的文件格式和越来越多的用于导出的文件格式选择,使用人数多。
支持导入的格式:3DS、3MF、DAE/Collada、DXF、FBX、GLTF、STP、STL、PLY
支持导出的格式:DAE (Collada)、STL、OBJ、PLY、JSON、STEP
GitHub地址链接:https://github.com/assimp/assimp
2、Meshlab
Meshlab:是一个开源、可移植和可扩展的三维几何处理系统,主要用于交互处理和非结构化编辑三维三角形网格。
支持导入的格式:PLY, STL, OBJ, 3DS, COLLADA, PTX, V3D, PTS, APTS, XYZ, GTS, TRI, ASC, X3D, X3DV, VRML, ALN
导出: PLY, STL, OFF, OBJ, 3DS, COLLADA, VRML, DXF, GTS, U3D, IDTF, X3D
Meshlab不支持fbx和gltf格式,且在转换过程无材质等信息。
地址链接:https://github.com/cnr-isti-vclab/meshlab
3、gltf官网也提供了些转换工具 https://www.khronos.org/gltf/
该网址提供了开源的转换工具,可将COLLADA,FBX和OBJ转换为gltf格式。在此附上github项目地址
obj2gltf:https://github.com/CesiumGS/obj2gltf
dae2gltf:https://github.com/KhronosGroup/COLLADA2GLTF
fbx2gltf: https://github.com/facebookincubator/FBX2glTF
————————————————
版权声明:本文为CSDN博主「wish_jk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Angel_fallen/article/details/106059317