-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathObjReader.py
58 lines (53 loc) · 1.79 KB
/
ObjReader.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
def open_file_obj(path, scale=1, _convert_faces_to_lines=False, ):
if isinstance(scale, int):
scale = (scale, scale, scale)
with open(path, "r") as f:
lines = f.readlines()
vertexes = []
faces = []
normals = []
normals_of_face = {}
vertex_index_offset = 0
i = 0
for line in lines:
i += 1
if not line.replace(" ", "") or line[0] == "#":
continue
try:
b = line.split()[0]
except Exception as ex:
b = None
print(f"Warning line {i} open obj", line, ex)
if b == "o":
# object
vertex_index_offset = len(vertexes)
if b == "v":
split = line.split()
vertex = [float(split[i + 1]) * scale[i] for i in range(3)]
vertexes.append(vertex)
if b == "vn":
split = line.split()
normal = [float(split[i + 1]) for i in range(3)]
normals.append(normal)
if b == "f":
face = []
for st in line.split(" ")[1:]:
try:
ar = list(map(lambda ii: int(ii)-1 if ii else -1, st.split("/")))
except:
print(line)
if len(ar) == 1:
ar = [ar[0], None, None]
if len(ar) == 2:
ar = [ar[0], None, ar[1]]
face.append(ar)
faces.append(face)
if _convert_faces_to_lines:
return vertexes, convert_faces_to_lines(faces), faces, normals
return vertexes, faces, normals
def convert_faces_to_lines(faces):
lines = set()
for face in faces:
lines.add(tuple(sorted((face[0], face[-1]))))
lines |= {tuple(sorted((face[i], face[i + 1]))) for i in range(len(face) - 1)}
return lines