St4rKiller070 napisał(a)
Sorry, ale w jaki sposób? Co mi to da?
Nie wiem jak biblioteka standardowa C++ stoi z wyrażeniami regularnymi, ale zawsze możesz do tego użyć zewnętrznej biblioteki :)
Wtedy cała zabawa w parsowanie pliku obj będzie się sprowadzała do sformułowania odpowiedniego wyrażenia regularnego, które Ci wyciągnie dane zgodne z wyrażeniem (wzorcem).
Np. korzystając z modułu re w Pythonie mógłbym zrobić takie wyrażenie:
wyrazenie="f ([0-9]*)/([0-9]*)/([0-9]*) ([0-9]*)/([0-9]*)/([0-9]*) ([0-9]*)/([0-9]*)/([0-9]*)"
W taki sposób je wykorzystać w skrypcie
import re
plik_obj="""# Blender3D v249 OBJ File:
# www.blender3d.org
mtllib cube.mtl
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000
vn 0.000000 0.000000 -1.000000
vn -1.000000 -0.000000 -0.000000
vn -0.000000 -0.000000 1.000000
vn -0.000001 0.000000 1.000000
vn 1.000000 -0.000000 0.000000
vn 1.000000 0.000000 0.000001
vn 0.000000 1.000000 -0.000000
vn -0.000000 -1.000000 0.000000
usemtl Material
s off
f 5/1/1 1/2/1 8/3/1
f 1/2/1 4/4/1 8/3/1
f 3/1/2 7/2/2 8/4/2
f 3/1/2 8/4/2 4/3/2
f 2/1/3 6/2/3 3/3/3
f 6/2/4 7/4/4 3/3/4
f 1/1/5 5/2/5 2/3/5
f 5/2/6 6/4/6 2/3/6
f 5/1/7 8/2/7 7/4/7
f 5/1/7 7/4/7 6/3/7
f 1/1/8 2/2/8 3/4/8
f 1/1/8 3/4/8 4/3/8
"""
wyrazenie="f ([0-9]*)/([0-9]*)/([0-9]*) ([0-9]*)/([0-9]*)/([0-9]*) ([0-9]*)/([0-9]*)/([0-9]*)"
fejsy=re.findall(wyrazenie, plik_obj,re.U|re.I|re.M)
print fejsy
No i dostanę wynik:
[('5', '1', '1', '1', '2', '1', '8', '3', '1'), ('1', '2', '1', '4', '4', '1', '8', '3', '1'), ('3', '1', '2', '7', '2', '2', '8', '4', '2'), ('3', '1', '2', '8', '4', '2', '4', '3', '2'), ('2', '1', '3', '6', '2', '3', '3', '3', '3'), ('6', '2', '4', '7', '4', '4', '3', '3', '4'), ('1', '1', '5', '5', '2', '5', '2', '3', '5'), ('5', '2', '6', '6', '4', '6', '2', '3', '6'), ('5', '1', '7', '8', '2', '7', '7', '4', '7'), ('5', '1', '7', '7', '4', '7', '6', '3', '7'), ('1', '1', '8', '2', '2', '8', '3', '4', '8'), ('1', '1', '8', '3', '4', '8', '4', '3', '8')]
Można napisać zaawansowane wyrażenie, które się dopasowuje do ilości wierzchołków każdego face'a. Albo też można sprawdzać kilkoma wyrażeniami po kolei - dla czworokątów, trójkątów itd. po prostu będzie inna ilość takich zapisów: ([0-9])/([0-9])/([0-9]*)
Jednak jak się dobrze napisze wyrażenie (np. całą funkcjonalność zrobisz jednym wyrażeniem :D ) to można znacznie ograniczyć ilość kodu :)
ps. Ty eksportujesz bez koordynatów tekstur albo bez normalnych więc wyrażenie dla Twojego pliku obj to będzie: f ([0-9]*)/([0-9]*) ([0-9]*)/([0-9]*) ([0-9]*)/([0-9]*)