Delphi-Quellcode:
type
TVertex = record
x,
y,
z : double;
end;
TOBJFace = record
num : Integer;
x,
y,
z : double;
end;
Methode zum File-Schreiben:
Delphi-Quellcode:
procedure WriteOBJ(const coords: TVertex);
var Fnum, c, ed : Byte;
PolyVertex : TVertex;
begin
TestFileSize;
Fnum := DeterminPolyCount;
if Fnum > 0 then
begin
for c := 1 to Fnum+1 do
begin
MakePolygonIndex(c);
for ed := 1 to 3 do
begin
PolyVertex := MakeWorldCoords(Edges[ind[ed]], coords);
WriteLn(f, 'v ' + FloatToStrF(PolyVertex.x*10, ffFixed, 16, 3, fset) + ' ' +
FloatToStrF(PolyVertex.y*10, ffFixed, 16, 3, fset) + ' ' +
FloatToStrF(PolyVertex.z*10, ffFixed, 16, 3, fset));
end; // ed-Loop
WriteLn(f, 'f ',cf,'/',cf,' ',cf+1,'/',cf+1,' ',cf+2,'/',cf+2,'');
inc(cf, 3);
inc(cf2, 3);
end; // c-Loop
end; // If Fnum > 0
end;
Ich habe immer eine Ebene von Würfeln, die die Punkte enthalten (array), allerdings erst noch über einen internen Index. Also muss ich erst noch die "Weltkoordinaten" bestimmen - das bläht den Code so auf. Ferner nehme ich mir jeden Würfel einzeln vor, und schaue nach, wie viele Flächen in ihm errechnet wurden. Es sind IMMER Dreiecke. Dann nehme ich mir eine jede Fläche, und bestimme die Weltkoordinaten der zugehörigen Punkte (anhand von Daten, die hier nicht ersichtlich sind. Nicht wirklich relevant.). Diese werden nacheinander in das File geschrieben, und über das gesamte Drahtgitter mitgezählt. Danach schreibe ich mit der Zeile:
WriteLn(f, 'f ',cf,'/',cf,' ',cf+1,'/',cf+1,' ',cf+2,'/',cf+2,'');
Die Flächendefinition direkt unter die Deklaration der 3 Vertices.
(Das Gedönse mit 'cf' und so kommt deshalb zu stande, weil ich der Größe wegen schon die Ausgabe in mehrere Files splitten muss! Und die Vertex-Zählung beginnt für jedes File von neuem.
... ein kleiner Copy&Paste aus meinem Code
Das an sich ist nicht das Problem!
Zitat von
choose:
Wenn Fläche nicht in AusgebeFlächen
erstelle neue Fläche g
Für jeden Punkt p in f
q:= findeOderErzeugePunkt in AusgabePunkte
füge q zu g hinzu
füge g den Ausgabeflächen hinzu
Die fetten Zeilen sind das eigentlich Problem. Ich habe über 1mio Punkte, die ich ALLE auf Redundanz testen müsste. Das ist schon ressourcentechnisch hart an der Grenze, von Rechenzeit mal ganz abgesehen
Von daher dachte ich an eine Baumstruktur, wo jeder Node (=Vertex) auf seine "Mit-Flächen-Erzeuger" zeigt, und ich rekursiv absuche, ab einem Startpunkt, welche Koordinaten zu welcher Fläche gehören. Allerdings entsteht ein Zeiger-Loop, da in einem Dreieck ja jeder Punkt eine Verbindung zu seinen beiden Mitstreitern hat. Somit würde man "im Kreis pointern", und die Rekursion läuft bis in alle Tage...
Sorry, die erste Erklärung war wohl doch etwas knapp in den Details. Es geht letztenendes um das "Marching Cube"-Verfahren, daher die Unterteilung in virtuelle Würfel. Das ist aber für das Problem an sich nicht maßgebend, aber vielleicht hilfreich zu wissen
Dank'schö schonmal, und nochmal,
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel