Kämpfen oder fliehen?

Die mobile Denkfabrik  –  1 Kommentare

Im täglichen Lebens steht man immer wieder vor der Frage, ob man ein Problem durch einen Frontalangriff oder durch Flankieren beheben soll. Dies ist auch im IT-Bereich der Fall.

Als Beispiel dafür wollen wir das Parsen von -obj-Dateien für Direct3D ansehen. Eine von Blender generierte Datei sieht – vom Schema her – so aus:

# Blender v2.70 (sub 0) OBJ File: ''
# www.blender.org
v -0.195090 0.980785 0.000000
v -0.382683 0.923880 0.000000
v -0.555570 0.831470 0.000000
...
vn -0.952718 -0.289003 -0.093835
vn -0.990438 0.097550 -0.097550
vn -0.878613 0.469628 -0.086536
...


s off
f 9//1 24//1 25//1
f 8//2 7//2 22//2

...

Die mit f beginnenden Zeilen geben die Struktur der Dreiecke an. Der erste Teil-String gibt die Normal- und Vertexkoordinaten für X an, der zweite für Y und der dritte für Z. Beim Einlesen mit einem Filestream bekommen man drei Teil-Strings zurück, die – vergleichsweise aufwendig – in ihre Einzelteile zu zerlegen sind.

Wer es mit nur einem oder zwei Modellen zu tun hat, kann das Problem durch Suchen und Ersetzen in der Modelldatei beheben. Wer / durch ein Leerzeichen ersetzt, bekommt Files nach folgendem Schema:

s 1
f 1 1 3 2 45 3
f 2 4 48 5 46 6
f 3 2 5 7 43 8
f 4 9 46 6 44 10

Diese lässt sich sodann – mit wenig Aufwand – nach folgendem Schema einlesen:

elseif (whatsIt.compare("f") == 0)
{
int v1, n1, v2, n2, v3, n3;
readStream >> v1 >> n1 >> v2 >> n2 >> v3 >> n3;

v1--;
v2--;
v3--;
n1--;
n2--;
n3--;