wie man eine Spirale mit opengl zeichnet

8

Ich möchte wissen, wie man eine Spirale zeichnet.

Ich habe diesen Code geschrieben:

%Vor%

Wenn ich die z-Ausdrücke nicht einschließe, bekomme ich einen perfekten Kreis, aber wenn ich z einschließe, dann bekomme ich 3 Punkte, das ist es. Was hätte passieren können?

Ich setze das Ansichtsfenster mit glviewport (0,0, w, h)

Um z einzubeziehen, sollte ich etwas tun, um das Ansichtsfenster in z-Richtung zu setzen?

    
codemax 14.12.2009, 17:43
quelle

3 Antworten

14

Sie sehen Punkte, weil Sie Punkte mit glBegin(GL_POINTS) zeichnen. Ersetzen Sie es durch glBegin(GL_LINE_STRIP) .

HINWEIS: Wenn Sie den Kreis sahen, zeichneten Sie auch nur Punkte, aber nahe genug, um als zusammenhängender Kreis zu erscheinen.

Außerdem haben Sie möglicherweise den Tiefenpuffer nicht so eingerichtet, dass er Werte im Bereich z = [-50, 310] akzeptiert, die Sie verwenden. Diese Argumente sollten als Clipping-Ebenen zNear und zFar in Ihrem Aufruf gluPerspective , glOrtho() oder glFrustum() bereitgestellt werden.

HINWEIS: Das würde erklären, warum Sie mit z-Wert nur einige wenige Punkte sehen: Die anderen Punkte werden abgeschnitten, weil sie außerhalb des z-Pufferbereichs liegen.

AKTUALISIEREN, NACHDEM SIE IHREN CODE GEZEIGT HABEN:

glOrtho(-100*aspectratio,100*aspectratio,-100,100,1,-1); würde nur Z-Werte im [-1, 1] Bereich zulassen, weshalb nur die drei Punkte mit z = -1 , z = 0 und z = 1 gezeichnet werden (also 3 Punkte).

Schließlich betrachten Sie wahrscheinlich die Spirale von oben und schauen direkt in die Richtung der Rotationsachse. Wenn Sie keine perspektivische Projektion (sondern eine isometrische) verwenden, wird die Spirale immer noch als Kreis angezeigt. Vielleicht möchten Sie Ihre Ansicht mit gluLookAt() ändern.

BEISPIEL FÜR DIE EINSTELLUNG VON PERSPEKTIVEN

Der folgende Code stammt aus den exzellenten OpenGL-Tutorials von NeHe:

%Vor%

Dann würde in Ihrer Zeichnungsschleife so etwas aussehen:

> %Vor%

Natürlich sollten Sie diesen Beispielcode Ihren Bedürfnissen anpassen.

    
catchmeifyoutry 14.12.2009 17:47
quelle
1

catchmeifyoutry bietet eine vollkommen geeignete Methode, zeichnet jedoch keine räumlich genaue 3D-Spirale, da bei jedem Renderaufruf mit einem primitiven GL_LINE-Typ eine Rasterung auf eine feste Pixelbreite erfolgt. Dies bedeutet, dass beim Ändern der Perspektive / Ansicht die Linien die Breite nicht ändern. Verwenden Sie dazu einen Geometrieshader in Kombination mit GL_LINE_STRIP_ADJACENCY, um 3D-Geometrie zu erstellen, die wie jede andere 3D-Geometrie gerastert werden kann. (Dies erfordert jedoch, dass Sie die Post-Fixed-Function-Pipeline verwenden)

Ich empfahl Ihnen, die Methode von catchmeifyoutry zuerst zu versuchen, da dies viel einfacher ist. Wenn Sie nicht zufrieden sind, versuchen Sie die beschriebene Methode. Sie können den folgenden Beitrag als Anleitung verwenden:

Zypern

    
quelle
1

Hier ist meine Spiralfunktion in C. Die Punkte werden in einer Liste gespeichert, die leicht mit OpenGL gezeichnet werden kann (z. B. benachbarte Punkte in der Liste mit GL_LINES verbinden).

  • cx, cy ... spiral zentrierte x- und y-Koordinaten
  • r ... maximaler Spiralradius
  • num_segments ... Anzahl der Segmente, die die Spirale haben wird

    %Vor%

Ein Beispielbild mit r = 1, num_segments = 1024:

P.S. Es gibt Unterschiede in der Verwendung von cos (double) und cosf (float).      Sie verwenden eine Float-Variable für eine Doppelfunktion cos.

    
YesThatIsMyName 19.09.2013 11:31
quelle

Tags und Links