PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Indices für Mesh berechnen - wie?


Simon
2003-03-09, 15:59:08
Hallo,

also, so langsam verzweifel ich wirklich. Ich versuche eine Landschaft darzustellen und die Indices zu den Vertices zu erstellen, aber irgendwie krieg ich das nicht hin. Kann vielleicht auch daran liegen, dass ich generell keine Ahnung hab, wie man Indices für größere Meshes generiert.

Also, wenn mir jemand dazu eine gute Seite nennen kann oder mir bei folgendem Code helfen könnte, wär ich ihm sehr verbunden ;D

Höhen berechen:

for (i = 0 ; i < terrainGridLength; i++)
for (j = 0;j < terrainGridWidth; j++)
{
// compute the height as a value between 0.0 and 1.0
pointHeight = info->imageData[mode*(i*terrainGridWidth + j)+(mode-1)] / 256.0;
terrainHeights[i*terrainGridWidth + j] = pointHeight;
}


//zeichnen

startW = terrainGridWidth / 2.0 - terrainGridWidth;
startL = - terrainGridLength / 2.0 + terrainGridLength;
for (i = 0 ; i < terrainGridLength-1; i++) {
glBegin(GL_TRIANGLE_STRIP);
for (j = 0;j < terrainGridWidth; j++)
{

x = startW + j + xOffset;
y = terrainHeights[(i+1)*terrainGridWidth + (j)] + yOffset;
z = startL - (i+1) + zOffset;
x*= scale;
z*= scale;

glVertex3f(x,y,z);

x = startW + j + xOffset;
y = terrainHeights[(i)*terrainGridWidth + j] + yOffset;
z = startL - i + zOffset;
x*= scale;
z*= scale;

glVertex3f(x,y,z);

}
glEnd();
}


Ich hab keine Ahnung, wie man daraus Indices erstellt ...


Danke im Voraus und bye, Enrico

Demirug
2003-03-09, 16:28:13
Das vollautomatische erzeugen von Indices für ein belibiges Mesh erfolgt nach folgendem Prinzip.


foreach Vertex vertex in Mesh
{
int Index = vertexlist.Find (vertex);

if (Index == -1) // not find
{
Index = vertexlist.Count;
vertexlist.Add (vertex);
}

indexlist.Add (Index)
}


Sollte ein Mesh aus mehreren primtiven besetehen sollte man erst alle Verticen in die vertexlist einfügen und dann pro Primitive die Indices bestimmen. Da das ein recht aufwendiges Verfahren ist sollte man es nicht online sondern schon bei aufbereiten der Daten vornehmen. Das optimieren dieser Liste für einen Post vertex cache ist dann der nächste Schritt um die Performnaces zu erhöhen.

Bei einer Landschaft welche auf einem festen grid aufbaut ist das aber alles etwas einfacher. Zuerst für jeden Punkt des Grids x,y,z (sowie bei bedarf die Normale und Texturkoordinaten) berechnen und in einem Vertexarray speichern. Die Position im Array bestimmt man über die x und y Position im Grid. Und genau diese Position im Array ist dann auch der Index der für den Strip gebraucht wird.

Simon
2003-03-09, 17:33:41
Hallo,


Originally posted by Demirug
Zuerst für jeden Punkt des Grids x,y,z (sowie bei bedarf die Normale und Texturkoordinaten) berechnen und in einem Vertexarray speichern.
Ok, hab ich :)

Originally posted by Demirug
Die Position im Array bestimmt man über die x und y Position im Grid. Und genau diese Position im Array ist dann auch der Index der für den Strip gebraucht wird.
:-( Ganz blöde Frage: Wie sieht das: "Die Position im Array bestimmt man über die x und y Position im Grid" im Code aus?

Irgendwie krieg ich heute gar nix hin :-(

bye Enrico

Simon
2003-03-09, 18:21:28
Hi,


ich glaub, ich habs jetzt:

for(i=0; i < terrainGridLength-1; i++)
{
if(switch_sides)
{
for(j=terrainGridWidth-1; j >=0; j--)
{
CurrVertex = i*terrainGridWidth+j;
Indices[index++] = CurrVertex;
Indices[index++] = CurrVertex+terrainGridWidth;
}
}
else
{
for(j=0; j < terrainGridWidth-1; j++)
{
CurrVertex = i*(terrainGridWidth)+j;
Indices[index++] = CurrVertex+terrainGridWidth;
Indices[index++] = CurrVertex;
}
} switch_sides = !switch_sides;
}

Und das ganze dann als triangle strip rendern :-) :-) :-) :-) :-) :-) :-) :-)

Jetzt kann ich das ganze endlich in meinen Octree sortieren :-)

bye Enrico