PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Komplexe Flächen in OpenGL


Frank
2002-09-19, 22:23:19
Da ich gerade erst in OpenGL neu einsteige (bin in T18 bei NeHe :) ) eine evtl doch recht einfache Frage von mir:

Wie kann man auf einfachsten Wege nichttriviale Flächen (nicht so wie Kugel, Zylinder, ...) in OpenGL realisieren? Evtl gibts da ja recht einfache Lösungen.

(Und nichttrivial versteh ich zum Beispiel die Boyfläche.)


edit1:

nochmal genauer:
ich faule Sau :stareup: hab also eine Paramter- oder Implizite Darstellung und will das auf simplen Wege visualisieren.


edit2:
nochmal ein Bildchen :)

http://rcswww.urz.tu-dresden.de/~fh468638/Grundmodell.gif

zeckensack
2002-09-19, 22:46:06
Schau mal, ob dir das hier weiterhilft:
http://www.opengl.org/developers/code/mjktips/grid/

(oder gleich http://www.google.com/search?q=OpenGL+evaluators&sourceid=opera&num=0&ie=utf-8&oe=utf-8)

Frank
2002-09-19, 22:56:46
thx
wer ich mir mal reinziehen.

Scheint aber großteilig auf Beziér und CO ausgelegt zu sein... das wär nich so gut

*durchschau*

zeckensack
2002-09-19, 23:40:43
Originally posted by Frank
thx
wer ich mir mal reinziehen.

Scheint aber großteilig auf Beziér und CO ausgelegt zu sein... das wär nich so gut

*durchschau* Jojo, das Problem ist, daß OpenGL selbst nur diese evaluators kennt. Wenn dein Problem damit nicht lösbar ist, brauchst du extra Libraries dafür, oder mußt das ganze zu Fuß in Dreiecke zerlegen.

btw, der Zylinder und der Teapot kommen aus der glu, das ist auch nur ein aufgesetztes Toolkit.
Bei den Evaluators besteht immerhin die entfernte Möglichkeit, daß sie irgendwann ohne Codeänderung HW-beschleunigt werden könnten, da sie Teil der OpenGL-Corespec sind. (könnten deshalb, weil sich das ganze als wenig brauchbar erwiesen hat, und nur noch für die Abwärtskompatibilität angeboten wird - mit allen mir bekannten Karten in Software)

Xmas
2002-09-20, 00:02:20
Im Grunde reichen doch ein paar for-Schleifen aus, oder?


typedef double[3] vector;

#define UMAX PI
#define VMAX PI/2
#define USTEPS 100
#define VSTEPS 100

vector grid[USTEPS + 1][VSTEPS + 1];

double u = 0, v = 0;
for( int i = 0; i <= USTEPS; i++ )
{
for( int j = 0; j <= VSTEPS; j++ )
{
// hier die Auswertung für grid[i][j] mit u und v

v += VMAX / VSTEPS;
}
u += UMAX / USTEPS;
}

for( int i = 0; i <= USTEPS; i++ )
{
glBegin( GL_QUAD_STRIP );
for( int j = 0; j < VSTEPS; j++ )
{
glVertex3dv( grid[i][j] );
glVertex3dv( grid[i][j + 1] );
}
glEnd();
}

Frank
2002-09-20, 16:37:38
klingt einleuchtend.

Wenn du mir jetzt noch sagst, was GL_QUAD_STRIP anders macht als GL_QUADS und was das dv genau bedeutet hinter den glVertex3, bekommst du einen Bussi von mir. :)

zeckensack
2002-09-20, 16:43:44
Mit GL_QUAD_STRIP werden zwei Vertices vom letzten Quad für den nächsten wiederverwendet. Ein Schaubild dazu findet sich in der OpenGL1.3-Spec auf Seite 18 (laut Acrobat Reader ist das Seite 30, steht aber 18 drüber).

dv:
d steht für den Datentyp double
v steht für Vector, was darauf hinausläuft, daß man einen Zeiger auf die Daten an die Funktion übergibt, anstatt der Daten selbst.

glVertex4d erwartet zB vier Argumente des Typs double
glVertex3f erwartet drei Argumente des Typs float

glVertex3fv erwartet einen Zeiger auf drei floats
und
glVertex3dv erwartet einen Zeiger auf drei doubles

hth :)

Frank
2002-09-20, 16:55:32
aahh
nochmal schön zusammengefasst



/me verteielt Thinkpad X30's als Dankeschön