Frage

Ich bin mit freeglut für OpenGL-Rendering ...

Ich brauche einen umhüllen zu ziehen wie ein Kegel (2D) auf der Suche, das angewendet mit etwas Farbe und etwas Transparenz gefüllt werden muss.

Ist das freeglut Toolkit mit einer solchen eingebauten Funktionalität ausgestattet gefüllt Geometrien (oder ein Trick) zu ziehen? oder gibt es eine andere api, die gefüllt Geometrien eine eingebaute Unterstützung hat ..

Edit1: nur um die Kegel Sache 2D zu klären ... die umhüllen ist die grafische Interpretation des Abdeckungsbereichs eines Flugzeugs während des Abfangens (eines feindlichen Flugzeuge) ..., dass ein Sektor eines circle..i ähnelt sollte stattdessen Sektor erwähnt haben. .

und glutSolidCone doesnot mir helfen, wie ich einen gefüllten Kreissektor zeichnen wollen ..., die ich bereits getan haben ... was ist zu tun, bleibt es mit etwas Farbe zu füllen ... wie Geometrien mit Farbe in opengl zu füllen?

Edit2: Alle auf diese Fragen geschrieben Antworten können für mein Problem in einer Weise arbeiten .. Aber ich würde auf jeden Fall möchte einen Weg wissen, wie eine Geometrie mit etwas Farbe zu füllen. Sprich, wenn ich eine umhüllen zeichnen mag, die eine Parabel ist ... in diesem Fall würde es keine Standardschwemme Funktion tatsächlich eine gefüllte Parabel zu zeichnen (oder gibt es?) .. Also diese Frage zu verallgemeinern ... wie eine benutzerdefinierte Geometrie in einiger festen Farbe ziehen?

Edit3: Die Antwort, die mstrobl Werke für GL_TRIANGLES geschrieben, aber für einen solchen Code:

glBegin(GL_LINE_STRIP);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

, die ein Quadrat gezeichnet ... nur ein verdrahtetes Quadrat gezeichnet wird ... ich brauche es mit blauer Farbe zu füllen.

sowieso, es zu tun?

wenn ich curve..like einen pie..and einige Zeichenbefehle für ein geschlossenen setzen muß ich es mit einer Farbe füllen ist es eine Möglichkeit, es möglich zu machen ...

Ich weiß nicht, wie sie ihre möglich GL_TRIANGLES ... aber wie es für jede geschlossene Kurve zu tun?

War es hilfreich?

Lösung

Auf Edit3. So wie ich das verstehe Ihre Frage ist, dass Sie haben wollen OpenGL zeichnen Grenzen und alles zwischen ihnen mit Farben gefüllt werden sollen

Die Idee, die Sie hatten, war in Ordnung, aber ein Leitungsstreifen ist nur, dass -. Ein Streifen von Linien, und es hat keinen Bereich

Sie können jedoch haben die Linien miteinander zu verbinden um ein Polygon zu definieren. Das wird die Fläche des Polygons auf einer pro-Vertex-Basis ausfüllen. Die Anpassung des Code:

glBegin(GL_POLYGON);

glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(200.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 200.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);

glEnd();

Bitte beachten Sie jedoch, dass ein Polygon zeichnet diese Art und Weise hat zwei Einschränkungen:

  • Das Polygon muß konvex sein.
  • Dies ist ein langsamer Vorgang.

Aber ich nehme an, Sie wollen einfach nur die Arbeit zu erledigen, und das wird es tun. Für die Zukunft könnten Sie nur Ihre Polygon Triangulation.

Andere Tipps

Ich bin nicht sicher, was Sie unter „einschlagen“ bedeuten, aber ein Kegel ist eine primitive, dass Schwemme hat:

glutSolidCone(radius, height, number_of_slices, number_of_stacks)

Der einfachste Weg, um es mit Farbe zu füllen ist es mit Farbe zu zeichnen. Da Sie es etwas transparent machen möchten, müssen Sie einen Alpha-Wert zu:

glColor4f(float red, float green, float blue, float alpha)
// rgb and alpha run from 0.0f to 1.0f; in the example here alpha of 1.0 will
// mean no transparency, 0.0 total transparency. Call before drawing.

scheinend zu machen, hat Blending aktiviert werden. Und Sie müssen die Mischfunktion verwenden eingestellt. Was Sie wahrscheinlich mit der folgenden erreicht werden wollen. Wenn Sie mehr erfahren möchten, schreiben Sie mir einen Kommentar, und ich werde für einige gute Hinweise aussehen. Aber hier geht Ihr Setup:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Rufen Sie das, bevor Sie Zeichenoperationen zu tun, möglicherweise bei Programminitialisierung. :)

Da Sie Ihre Frage reclarified für eine Torte zu fragen: gibt es eine einfache Möglichkeit, das auch zu zeichnen mit Hilfe von OpenGL Primitiven:

Sie würden eine feste Kugel ziehen gluSolidSphere () verwenden. Da jedoch nur ein Teil will davon zeichnen, müssen Sie nur die unerwünschten Teile Clip entfernt:

void glClipPlane(GLenum plane, const GLdouble * equation);

Mit Ebene GL_CLIPPLANE0 zu GL_CLIPPLANEn ist und die Gleichung eine Ebenengleichung in Normalform ist (a x + b y + c * z + d = 0 würde Gleichung bedeuten würde, hält die Werte { a, b, c, d }. Bitte beachten Sie dass diejenigen, Doppelzimmer und nicht schwimmt.

Ich erinnere mich, ein Unterprogramm für das war. Aber es ist nicht zu hart und selbst zu tun.

Aber ich verstehe nicht, um das 2D--Thing. Kegel in 2D? Ist es nicht gerade ein Dreieck?

Wie auch immer, hier ist ein Algorithmus, um einen Kegel in opengl Zeichnung

zunächst einen Kreis, Unterteilung gleichmäßig, so dass Sie eine schöne Menge von Kanten erhalten. Nun wählen Sie die Mitte des Kreises, machen Dreiecke von den Rändern in die Mitte des Kreises. Dann wählen Sie einen Punkt über den Kreis und machen Dreiecke von den Rändern zu diesem Punkt.

Die Größe, Form und Ausrichtung hängt von den Werten, die Sie in den Kreis und zwei Punkte verwenden zu erzeugen. Jeder Schritt ist recht einfach und sollte keine Probleme für Sie verursachen.

Erste Unterteilung nur einen skalaren Wert. Starten Sie von [0-2] -Bereich. Nehmen Sie den Mittelpunkt ((Start + Ende) / 2) und teilen den Bereich mit. Speichern der Werte als Paare. Zum Beispiel sollten Sie einmal die Unterteilung geben: [(0,1), (1,2)] Diese Mitteilung rekursiv paar Mal, dann berechnen, was diese Punkte auf dem Kreis sind. Einfache Trigonometrie, nur nicht vergessen, die Werte mit π zu multiplizieren, bevor Sie fortfahren. Danach haben Sie eine bestimmte Menge an Kanten. 2 ^ n, wobei n die Anzahl der Unterteilungen. Dann können Sie sie einfach in Dreiecke verwandeln, indem sie einen Scheitelpunkt mehr geben. Menge der Dreiecke endet als daher: 2 ^ (n + 1). (Die Beträge sind nützlich zu wissen, wenn Sie es mit fester Größe Arrays tun.

Edit: Was Sie wirklich wollen, ist ein Kuchen. (Leider das Wortspiel)

Es ist ebenso einfach zu machen. Sie können wieder nur Dreiecke verwenden. Nur Skalar Bereich auswählen [-0,25 - 0,25]., Unterteile, Projekt Kreis und erzeugt einen Satz von Dreiecken

Die skalare - Kreis Projektion ist einfach als: x = cos (v * pi) r, y = sin (v pi) * R, wobei (x, y) die sich ergebende Scheitelpunkt ist, r ein Radius, und trigonometrische Funktionen arbeiten auf Luminanzen, nicht Grad. (Wenn sie mit Grad arbeiten, ersetzen pi mit 180)

Mit Vertex-Puffer oder Listen, es selbst zu machen.

Edit: Über die Färbung Frage. glColor4f, wenn Sie einige Teile der Geometrie wollen durch seine Farbe, anders zu sein, können Sie eine Farbe für jeden Vertex in Eckpunktpufferspeicher selbst zuweisen. Ich glaube nicht, jetzt wissen alle API, es zu tun aufruft, aber API-Referenz in opengl ist durchaus verständlich.

Auf dem Bearbeiten auf Farben:

OpenGL ist eigentlich eine Zustandsmaschine. Dies bedeutet, dass die aktuelle Material und / oder Farbposition wird verwendet, wenn Zeichnung. Da Sie wahrscheinlich nicht Materialien verwenden werden, ignorieren, dass für jetzt. Sie wollen Farben.

glColor3f(float r, float g, float b) // draw with r/g/b color and alpha of 1
glColor4f(float r, float g, float b, float alpha)

Damit werden die Farben von irgendwelchen Ecken beeinflussen Sie zeichnen, jeder Geometrie Sie machen - sei es glu ist oder einen eigenen - nach dem glColorXX Aufruf ausgeführt wurde. Wenn Sie ein Gesicht mit den Eckpunkten ziehen und die Farbe zwischen den / glVertex2f glVertex3f ändern Anrufen, werden die Farben interpoliert.

Versuchen Sie folgendes:

glBegin(GL_TRIANGLES);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(-3.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 3.0, 0.0);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(3.0, 0.0, 0.0);
glEnd();

Aber ich bei glColor4f zeigte bereits, so nehme ich an Sie die Farben auf einer pro-Vertex-Basis festlegen möchten. Und Sie wollen Listen mit Anzeige machen.

Wie Sie eine Liste von Scheitelpunkten angezeigt werden können, können Sie diese auch eine Liste der Farben machen: alles, was Sie tun müssen, ist die Farblisten zu ermöglichen und opengl sagen, wo die Liste befindet. Natürlich müssen sie die gleiche Ausstattung wie die Eckenliste (gleiche Reihenfolge) haben.

Wenn Sie hatte

glEnableClientState(GL_VERTEX_ARRAY);   
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glDisableClientState(GL_VERTEX_ARRAY);

sollten Sie Farben auf diese Weise hinzufügen. Sie müssen nicht Schwimmer sein; in der Tat, sagen Sie ihm, welches Format es sein sollte. Für eine Farbliste mit 1 Byte pro Kanal und 4 Kanäle (R, G, B und A) verwenden, um dies:

glEnableClientState(GL_VERTEX_ARRAY);   
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices_);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors_);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

EDIT: Vergessen hinzuzufügen, dass Sie dann OpenGL zu sagen haben, welche Elemente durch den Aufruf von glDrawElements .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top