2009-12-14 18 views
8

Voglio sapere come disegnare una spirale.come disegnare una spirale usando opengl

ho scritto questo codice:

void RenderScene(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    GLfloat x,y,z = -50,angle; 
    glBegin(GL_POINTS); 

    for(angle = 0; angle < 360; angle += 1) 
    { 
     x = 50 * cos(angle); 
     y = 50 * sin(angle); 
     glVertex3f(x,y,z); 
     z+=1; 
    } 
    glEnd(); 
    glutSwapBuffers(); 
} 

Se non includere i termini z ottengo un cerchio perfetto, ma quando includo z, tanto sono 3 punti che è in essa. Cosa potrebbe essere successo?

ho impostato la finestra utilizzando glViewport (0,0, w, h)

Per includere z devo fare di tutto per impostare finestra in direzione z?

risposta

14

Si vedono i punti perché si stanno disegnando dei punti con glBegin(GL_POINTS). Prova a sostituirlo con glBegin(GL_LINE_STRIP).

NOTA: quando hai visto il cerchio hai disegnato solo punti, ma disegnato abbastanza vicino da apparire come un cerchio collegato.

Inoltre, potrebbe non essere stato impostato il buffer di profondità per accettare i valori nell'intervallo z = [-50, 310] che si utilizza. Questi argomenti devono essere forniti come zNear e zFar piani di ritaglio nella chiamata gluPerspective, glOrtho() o glFrustum().

NOTA: questo spiegherebbe perché con il valore z si vedono solo alcuni punti: gli altri punti vengono ritagliati perché si trovano al di fuori dell'intervallo di z-buffer.

UPDATE Dopo la proiezione IL CODICE:

glOrtho(-100*aspectratio,100*aspectratio,-100,100,1,-1); consentirebbe solo valori z in [-1, 1] gamma, motivo per cui solo i tre punti con z = -1, z = 0 e z = 1 saranno disegnato (quindi 3 punti).

Infine, probabilmente stai osservando la spirale dall'alto, guardando direttamente nella direzione dell'asse di rotazione. Se non si utilizza una proiezione prospettica (ma una isometrica), la spirale verrà comunque visualizzata come un cerchio. Potresti voler cambiare la visualizzazione con gluLookAt().

esempio di configurazione di PROSPETTIVA

Il seguente code è tratto dalle ottimi tutorial OpenGL per NeHe:

glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION);      // Select The Projection Matrix 
glLoadIdentity();       // Reset The Projection Matrix 

// Calculate The Aspect Ratio Of The Window 
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); 

glMatrixMode(GL_MODELVIEW);      // Select The Modelview Matrix 
glLoadIdentity();       // Reset The Modelview Matrix 

Poi, nel vostro draw loop sarebbe simile a questa:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // Clear The Screen And The Depth Buffer 
glLoadIdentity(); 
glTranslatef(-1.5f,0.0f,-6.0f);     // Move Left 1.5 Units And Into The Screen 6.0 
glBegin(GL_TRIANGLES);      // Drawing Using Triangles 
    glVertex3f(0.0f, 1.0f, 0.0f);    // Top 
    glVertex3f(-1.0f,-1.0f, 0.0f);    // Bottom Left 
    glVertex3f(1.0f,-1.0f, 0.0f);    // Bottom Right 
glEnd();  

Ovviamente, è necessario modificare questo codice di esempio in base alle proprie esigenze.

1

catchmeifyoutry fornisce un metodo perfettamente funzionante, ma non disegna una spirale 3D spazialmente precisa, poiché qualsiasi richiamo di rendering utilizzando un tipo primitivo GL_LINE rasterizzerà a larghezza fissa di pixel. Ciò significa che quando cambi la tua prospettiva/vista, le linee non cambieranno larghezza. Per ottenere ciò, utilizzare uno shader di geometria in combinazione con GL_LINE_STRIP_ADJACENCY per creare una geometria 3D che può essere rasterizzata come qualsiasi altra geometria 3D.(Ciò richiede tuttavia l'uso della pipeline post-funzione fissa)

Ti ho raccomandato di provare prima il metodo di catchmeifyoutry in quanto sarà molto più semplice. Se non sei soddisfatto, prova il metodo che ho descritto. È possibile utilizzare il seguente post come guida:

http://prideout.net/blog/?tag=opengl-tron

+0

Questa è una lettura interessante, signor. insalata :) – catchmeifyoutry

+0

Sì, quel blog è pieno di fantastici algoritmi grafici. Questo è il mio preferito: http://prideout.net/blog/?p=69 –

1

Ecco la mia funzione a spirale in C. I punti vengono salvati in un elenco che può essere facilmente disegnato da OpenGL (per esempio, collegare i punti adiacenti nella lista con GL_LINES) .

  • cx, cy ... centro della spirale xey coordinate
  • r ... max raggio spirale
  • NUM_SEGMENTS ... numero di segmenti della spirale avrà

    SOME_LIST* UniformSpiralPoints(float cx, float cy, float r, int num_segments) 
    { 
    SOME_LIST *sl = newSomeList(); 
    int i; 
    
    for(i = 0; i < num_segments; i++) 
    { 
    float theta = 2.0f * 3.1415926f * i/num_segments; //the current angle 
    
    float x = (r/num_segments)*i * cosf(theta); //the x component 
    float y = (r/num_segments)*i * sinf(theta); //the y component 
    
    //add (x + cx, y + cy) to list sl 
    
    } 
    return sl; 
    } 
    

un'immagine esempio con r = 1, NUM_SEGMENTS = 1024:

enter image description here

P.S. C'è differenza nell'usare cos (double) e cosf (float). Si utilizza una variabile float per una doppia funzione cos.

Problemi correlati