View Full Version : vertex arrays
hi,
wir haben im allgemeinen mehr normalvektoren und texturkoordinaten als vertices. wir haben es nicht geschafft solche meshes über vertex-arrays zu
definieren.
habt ihr irgendwelche tips oder tricks für uns?
lg,
- henon
das ist im endefekt genau das was ich gerade in mein modellsystem einbaue :) die einfachste methode ist es falls zb ein vertex 2 verschiedene texturkoordinaten hat diesen zweimal in dem vertexarray abzulegen (auch wenn das redundant ist)
das kostet zwar speicher bringt aber enorm geschwindigkeit
ja dran haben wir auch gedacht. gut zu hören dass das funktioniert.
danke.
MarianSchedenig
31-05-2004, 00:44
Die Frage ist nur: Wie kriegen wir unsere Vertices in die entsprechende Form?
Wir verwenden Milkshape-Models. Dabei besteht jeder Vertex aus:
- Index der Vertex-Koordinaten (sind in einem Array des Models gespeichert)
- Normalvektor
- Texturkoordinaten
D.h. ein Vertex-Index muß evtl. für OpenGL auf mehrere Koordinaten aufgespalten werden, wenn sich die Normals/Texturen unterscheiden. Nur wie? Ich such schon die ganze STL durch und finde keinen Container, der mir das irgendwie erleichtert - hatte zuerst gedacht, ich werde die Koordinaten alle in ein Set stellen (das jeden Wert nur 1x erlaubt) und daraus meine Indizes gewinnen, aber sämtliche STL-Container liefern immer nur Iteratoren zurück, und die helfen mir nicht viel, wenn ich einen Index brauche.
Kann doch nicht sein, daß man das mit C++ noch komplett händisch programmieren muß?
(Oder einfach für JEDEN Vertex einen eigenen Array-Eintrag verwenden, auch wenn dieselbe Koordinaten/Normalvektor/Texturkoordinaten-Kombination mehrfach vorkommt? Weil das bei texturierten Models wahrscheinlich seltener der Fall ist?)
ChrisChiu
01-06-2004, 02:44
Indexifizieren geht mit der STL MAP.
Etwa so:
#define STL_MAP std::map
STL_MAP<float, STL_MAP<float, STL_MAP<float, int> > > IndexMap;
Diese map muß man dann entsprechend füllen, im Endeffekt soll rauskommen, dass
IndexMap[x][y][z]
gleich dem Index ist. Das kann man erweitern, indem man zusätzlich noch die Texturkoordinaten oder ähnliches hinzufügt (dabei hilft dann eine Klasse schon, damit man keine endlos langen STL_MAP < ... > Zeilen hat, diese muß dann soweit ich weiß den Gleichheits sowie den Kleiner-Operator definiert haben um mit einer STL Map zu funktionieren).
Bin jetzt zu müde um das genauer auszuführen, falls noch mehr Informationen gewünscht sind, schreib ich die morgen oder so.
MarianSchedenig
01-06-2004, 12:30
Danke, an sowas hab ich ja auch gedacht...aber laut meiner STL-Referenz (C/C++ ge-packt von Herbert Schildt) hat auch eine map keine Methode, die mir den *Index* eines Elements zurückliefert. Mit einem Iterator fange ich in dem Fall ja wenig an, es sei denn, ich durchsuche die ganze map von vorne bis hinten manuell nach dem Wert, den ich gerade eingetragen hab...
Oder ist meine Referenz lückenhaft? Hab bisher eigentlich immer gedacht, das Buch wäre recht gut (nur miserabel gebunden ;))
ChrisChiu
01-06-2004, 16:47
Naja, den Index erhälst du ja dadurch, dass du zu einem [x, y, z, s, t, wasauchimmerduwillst]-Tupel einen Integer zuordnen kannst...
Du mußt auf jedenfall die Vertizes traversieren, und dabei einen Integer-Index mitführen und in die Map eintragen, z.b.:
für alle Vertizes und Texturkoordinaten
{
Initialisiere map[x, y, z, s, t] auf -1
}
int i = 0;
für alle Vertizes und Texturkoordinaten
{
setze map[x, y, z, s, t] auf i;
erhöhe i um 1 (i++);
}
Danach hast du zu einem Tupel x, y, z, s, t in der map den eindeutigen Index zugeordnet, und kannst dann das Indexarray anlegen.
MarianSchedenig
01-06-2004, 20:00
Ok, aber krieg ich die Elemente denn auch in dieser Reihenfolge aus der Map raus? Hab mir eingebildet, die Map würde das nicht garantieren....trotzdem kann ich natürlich zur Not den mitgelieferten Index ins Tupel speichern und sie Elemente dann so von der Map in ein Array übertragen - war wieder mal zu blöd, um auf das zu kommen. ;) Danke!
grimreaper
01-06-2004, 20:32
Ok, aber krieg ich die Elemente denn auch in dieser Reihenfolge aus der Map raus?eine map ist nach dem key sortiert (du kannst die sortierung ändern/abschalten) indem du eine selber-gebasltelte vergleichsoperation an die map übergibst.
MarianSchedenig
01-06-2004, 21:18
D'oh, das ist natürlich wahr. Jetzt merk ich auch erst, was Du oben meintest...das komplette Vertex-Tupel als Map-Key nehmen und dadurch den Index kriegen.
Thx, so werde ich's machen! :)
vBulletin® v3.7.1, Copyright ©2000-2008, Jelsoft Enterprises Ltd.