punkte geradenstücke (liniensegmente) polygone...darstellung von punkten i glbegin(gl_points); /*...
Post on 19-Nov-2020
1 Views
Preview:
TRANSCRIPT
Graphische Primitive
• Punkte
• Geradenstücke (Liniensegmente)
• Polygone
Universität Frankfurt
Punkte
glVertex3f (50.0, 50.0, 0.0)
glVertex2f (50.0, 50.0)
glVertex4f (50.0, 50.0, 0.0,1.0)
GLfloat vect[3] = {50.0, 50.0, 0.0}
glVertex3fv (vect)
Universität Frankfurt
Darstellung von Punkten I
glBegin(GL_POINTS); /* Liste von Punkten */glVertex2f (50.0, 50.0) ; /* Punkt-Definition */glVertex4f (-25.0, -25.0, 0.0, 1.0); /* “ */glVertex4f (0.0, 0.0, 0.0,1.0); /* “ */ glVertex3f (319.0, -14.0, 0.0); /* “ */glVertex3f (7.0, 3.0, 0.0); /* “ */glVertex2f (-30.0, 12.0); /* “ */
glEnd(); /* Ende der Liste */
Universität Frankfurt
Darstellung von Punkten II
Universität Frankfurt
Darstellung von Punkten III
glPointSize(7.0); /* Punktgröße definieren */
glBegin(GL_POINTS); /* Liste von Punkten */glVertex2f (50.0, 50.0) ; /* Punkt-Definition */glVertex4f (-25.0, -25.0, 0.0, 1.0); /* “ */glVertex4f (0.0, 0.0, 0.0,1.0); /* “ */ glVertex3f (319.0, -14.0, 0.0); /* “ */glVertex3f (7.0, 3.0, 0.0); /* “ */glVertex2f (-30.0, 12.0); /* “ */
glEnd(); /* Ende der Liste */
Universität Frankfurt
Darstellung von Punkten IV
Universität Frankfurt
Inquiry-Funktion:
GLfloat size[2]; /* min/max Größe */
GLfloat step; /* Schrittweite */
glGetFloatv (GL_POINT_SIZE_RANGE, size);
glGetFloatv (GL_POINT_SIZE_GRANULARITY, &step);
Darstellung von Punkten IV
Universität Frankfurt
Darstellung von Punkten Vvoid display(void){float angle, x, y;GLclampf b = 0.0; GLclampf g = 0.0;GLfloat size = 10.0;
glClear(GL_COLOR_BUFFER_BIT);
for (angle=0.0; angle <= PI; angle+= PI/20.0) //#define PI 3.1415{
x = 30*cos(angle); y = 30.0*sin(angle);
glPointSize(size); // !!!
glBegin(GL_POINTS);glColor3f (1.0, b, g);glVertex2f (x, y);glEnd();
size += 0.5;b += 0.05; g += 0.05;
} /* end_for */
glFlush();}
Universität Frankfurt
Geradenstücke I
Universität Frankfurt
GLfloat vect[2] = {-30.0, 12.0}
glBegin(GL_LINES); /* Liste von Punkten */glVertex2f (50.0, 50.0) ; /* Punkt-Definition */glVertex4f (-25.0, -25.0, 0.0, 1.0); /* “ */glVertex4f (0.0, 0.0, 0.0,1.0); /* “ */ glVertex3f (19.0, -14.0, 0.0); /* “ */glVertex3f (7.0, 3.0, 0.0); /* “ */glVertex2fv (vect); /* “ */
glEnd(); /* Ende der Liste */
Geradenstücke II
Universität Frankfurt
Geradenstücke III
Universität Frankfurt
glLineWidth(5.0);
glBegin(GL_LINES); /* Liste von Punkten */glVertex2f (50.0, 50.0) ; /* Punkt-Definition */glVertex4f (-25.0, -25.0, 0.0, 1.0); /* “ */glVertex4f (0.0, 0.0, 0.0,1.0); /* “ */ glVertex3f (19.0, -14.0, 0.0); /* “ */glVertex3f (7.0, 3.0, 0.0); /* “ */glVertex2f (-30.0, 12.0); /* “ */glEnd(); /* Ende der Liste */
Geradenstücke IV
Universität Frankfurt
Inquiries:
GLfloat width_range[2];GLfloat step;
glGetFloatv (GL_LINE_WIDTH_RANGE, width_range);glGetFloatv (GL_LINE_WIDTH_GRANULARITY, &step);
Geradenstücke V
Universität Frankfurt
Geradenstücke VI
Universität Frankfurt
void display(void)
{
float angle, x, y;
GLclampf b = 0.0;
GLclampf g = 0.0;
glClear(GL_COLOR_BUFFER_BIT);
glLineWidth(3.0);
glBegin(GL_LINE_STRIP);
for (angle=0.0; angle <= PI; angle+= PI/11.0)
{
x = 30*cos(angle); y = 30.0*sin(angle);
glColor3f (1.0, b, g);
glVertex2f (x, y);
b += 0.1; g += 0.1;
} /* end_for */
glEnd(); /* Ende LINE_STRIP */
glFlush();
}
Geradenstücke VII
Universität Frankfurt
• GL_LINES
• GL_LINE_STRIP
• GL_LINE_LOOP
Geradenstücke VIIILine Stippling
Universität Frankfurt
Geradenstücke IXLine Stippling
Universität Frankfurt
void glLineStipple(GLint factor, GLushort pattern); // 1 <= factor <= 255
Beispiel:
glLineStipple (1, 0xAAAA);
glEnable(GL_LINE_STIPPLE);
....
glDisable(GL_LINE_STIPPLE);
Geradenstücke XLine Stippling
Universität Frankfurt
void display(void)
{
GLfloat y; // Varying Y coordinate
GLint factor = 1; // Stippling factor
GLushort pattern = 0x5555; // Simple stipple pattern
glClear(GL_COLOR_BUFFER_BIT); // Clear the window with current clearing color
glEnable(GL_LINE_STIPPLE); // Enable stippling
for(y = -40.0f; y <= 40.0f; y += 10.0f) // Step up Y axis 10 units at a time
{
glLineStipple(factor,pattern); // Reset the repetition factor and pattern
glBegin(GL_LINES); glVertex2f(-40.0f, y);
glVertex2f(40.0f, y);
glEnd();
factor++;
}
glFlush(); // Flush drawing commands
}
Geradenstücke XILine Stippling
Universität Frankfurt
Polygone IVoraussetzungen
Universität Frankfurt
• eben Polygon ist Teilmenge einer Ebene
• einfach keine Schnittpunkte der Kanten
• konvex jede Strecke zwischen zwei Punkten des Polygon liegt vollständig innerhalb des Polygons.
• zweiseitig (front face, back face)
Polygone IIDarstellung
Universität Frankfurt
• nur Eckpunkte (vertices)
• Umriß (outline)
• gefüllt mit oder ohne Muster (solid, stipple pattern)
Voreinstellung: gleiche Darstellung für Vorder- und Rückseite
Polygone IIIDarstellung
Universität Frankfurt
Einstellungen:
void glPolygonMode(GLenum face, Glenum mode)
face: GL_FRONT_AND_BACK, GL_FRONT, GL_BACK)
mode: GL_POINT, GL_LINE, GL_FILL
Beispiele:
glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_LINE);
Polygone IVDefinition von Vorder- und Rückseite
Universität Frankfurt
Definition der Vorderseite durch geordnete Aufzählung der Eckpunkte:
• mathematisch positiv / in Gegenuhrzeigerrichtung (counterclockwise):
• mathematisch negativ / in Uhrzeigerrichtung (clockwise)
Polygone VBestimmung von Vorder-/Rückseite in OpenGL
Universität Frankfurt
Berechnung der Polygonfläche in geeigneten Koordinaten:
Polygone VIDefinition der Vorderseite
Universität Frankfurt
Definition durch Festlegung der Drehrichtung:
void glFrontFace( GLenum mode)
mode: GL_CCW, GL_CW
default: GL_CCW
Beispiel:
glFrontFace (GL_CCW);
Polygone VIIaDarstellung
Universität Frankfurt
glBegin(GL_TRIANGLE_FAN); //Defined in counterclockwise order
glVertex3f(0.0, 0.0, 0.0);
for (i=0; i<=8; i++)
{
if (i%2 == 0)
glColor3f (1.0, 0.0, 0.0);
else glColor3f (0.0, 1.0, 0.0);
glVertex3f (cos(i*2*PI/8), sin(i*2*PI/8), 0.0);
}
glEnd();
glBegin(GL_TRIANGLE_FAN); //Defined in clockwise order
glColor3f (1.0, 0, 1.0);
for (i=0; i>= -7; i--)
glVertex3f (cos(i*2*PI/8)+1, sin(i*2*PI/8)+1, -1);
glEnd();
Polygone VIIbDarstellung
Universität Frankfurt
Polygone VIIIPolygon Stippling
Universität Frankfurt
void glPolygonStipple(GLubyte *mask)
mask: pointer to 32x32 stipple pattern
Beispiel:
GLubyte pattern[128];
glPolygonStipple (pattern);
glEnable(GL_POLYGON_STIPPLE)
….
glDisable(GL_POLYGON_STIPPLE)
Polygone VIIIaPolygon Stippling
Universität Frankfurt
Polygone VIIIbStippling Pattern
Universität Frankfurt
Polygone IX
Universität Frankfurt
GL_TRIANGLES
GL_TRIANGLE_FAN
GL_TRIANGLE_STRIP
GL_QUADS
GL_QUAD_STRIP
GL_POLYGON
void glRectw(GLww x1, GLww y1, GLww x2, GLww y2)
mit (w,ww) ε {(d, double),( f, float), (i, int),(s,short)}
Polygone IXa
Universität Frankfurt
void draw_triangles (void)
{
int i;
glBegin(GL_TRIANGLES); //Defined in counterclockwise order
for (i=0; i<8; i++)
{
if (i%2 == 0)
glColor3f (1.0, 1.0, 0.0);
else glColor3f (0.0, 1.0, 1.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f (cos(i*2*PI/8), sin(i*2*PI/8), 0.0);
glVertex3f (cos((i+1)*2*PI/8), sin((i+1)*2*PI/8), 0.0);
}
glEnd();
}
Polygone IXai
Universität Frankfurt
Polygone IXb
Universität Frankfurt
void draw_triangle_fan (void)
{
int i;
glBegin(GL_TRIANGLE_FAN); //Defined in counterclockwise order
glVertex3f(0.0, 0.0, 0.0);
for (i=0; i<=8; i++)
{
if (i%2 == 0)
glColor3f (1.0, 0.0, 0.0);
else glColor3f (0.0, 1.0, 0.0);
glVertex3f (cos(i*2*PI/8), sin(i*2*PI/8), 0.0);
}
glEnd();
}
Polygone IXbi
Universität Frankfurt
Polygone IXc
Universität Frankfurt
void draw_triangle_strip (void)
{
int i;
float phi = -1.0*PI;
float r = 1.5;
glBegin(GL_TRIANGLE_STRIP); //First triangle defined in counterclockwise order
glVertex3f (r*sin(PI/4.0)*cos(phi), r*cos(PI/4.0), r*sin(PI/8.0)*sin(phi));
glVertex3f (r*sin(PI/2.0)*cos(phi), r*cos(PI/2.0), r*sin(PI/2.0)*sin(phi));
for (i=0; i<8; i++)
{
if (i%2 == 0)
{
glColor3f (1.0, 1.0, 0.0);
glVertex3f (r*sin(PI/4.0)*cos(phi-(i+1)*PI/8.0), r*cos(PI/4.0), r*sin(PI/4.0)*sin(phi-(i+1)*PI/8.0));
}
Polygone IXci
Universität Frankfurt
else
{
glColor3f (0, 1.0, 1.0);
glVertex3f (r*sin(PI/2.0)*cos(phi-(i+1)*PI/8.0), r*cos(PI/2.0), r*sin(PI/2.0)*sin(phi-(i+1)*PI/8.0));
}
}
glColor3f (1.0, 1.0, 0.0);
glVertex3f (r*sin(PI/4.0)*cos(0.0), r*cos(PI/4.0), r*sin(PI/2.0)*sin(0.0));
glEnd();
}
Polygone IXcii
Universität Frankfurt
Polygone IXd
Universität Frankfurt
void draw_quads (void)
{
int i;
glBegin (GL_QUADS);
for (i=0; i>-8; i--)
{
if (i%2 == 0)
glColor3f (0.0, 0.0, 1.0);
else glColor3f (0.0, 1.0, 0.0);
glVertex3f (cos(i*PI/4.0), sin(i*PI/4.0), 0);
glVertex3f (0.5*cos(i*PI/4.0), 0.5*sin(i*PI/4.0), 1.5);
glVertex3f (0.5*cos((i-1)*PI/4.0), 0.5*sin((i-1)*PI/4.0), 1.5);
glVertex3f (cos((i-1)*PI/4.0), sin((i-1)*PI/4.0), 0);
}
glEnd();
}
Polygone IXdi
Universität Frankfurt
Polygone IXe
Universität Frankfurt
void draw_quad_strip(void)
{
int i;
glBegin (GL_QUAD_STRIP);
for (i=0; i>=-8; i--)
{
if (i%2 == 0)
glColor3f (1.0, 1.0, 0.0);
else glColor3f (1.0, 1.0, 1.0);
glVertex3f (cos(i*PI/4.0), sin(i*PI/4.0), 0);
glVertex3f (0.5*cos(i*PI/4.0), 0.5*sin(i*PI/4.0), 1.5);
}
glEnd();
}
Polygone IXei
Universität Frankfurt
Polygone XBoundary Edges
Universität Frankfurt
Rendering von Kanten:
void glEdgeFlag (GLboolean flag)
flag: GL_TRUE, GL_FALSE
default: GL_TRUE
Beispiel:
glEdgeFlag (GL_TRUE);
glVertex3f (……….);
glEdgeFlag (GL_FALSE)
glVertex3f (……….);
…
Polygone XIBack Face Culling
Universität Frankfurt
Rendering von Rückseiten:
glCullFace(Glenum mode)
mode: GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
default: GL_BACK
Beispiel:
glCullFace (GL_BACK)
glEnable (GL_CULL_FACE);
…
glDisable(GL_CULL_FACE);
Polygone XIIVerdeckungsrechnung
Universität Frankfurt
glutInitDisplayMode (GLUT_DEPTH | …);
…
glClear (GL_DEPTH_BUFFER_BIT | …);
glEnable(GL_DEPTH_TEST);
…
glDisable(GL_DEPTH_TEST);
Übungsaufgaben
Universität Frankfurt
Aufgabe 2: Orientierung von Polygonen
Geben Sie eine Herleitung für die Gleichung zur Bestimmung der Fläche eines Polygons aus derVorlesung. Wie/warum hängt die so berechnete Fläche mit der Orientierung des Polygons im Raumzusammen?
Aufgabe 3: Modellierung
Entwickeln Sie Algorithmen, um die gebräuchlichen, drei-dimensionalen Grundkörper, wie Würfel, Kugel, Zylinder, Tetraeder, Torus mit den zwei-dimensionalen Primitiven von OpenGL zuapproximieren. Schreiben Sie zu jedem Körper eine Routine draw_xxx() mit xxx∈∈∈∈{cube, ….., torus).
top related