Zylinder rendern?



  • Hi,

    ich möchte gerne für mein Spiel einen Zylinder erstellen jedoch ohne GluQuadrix. (es ist ein OpenGL spiel).

    Nun, wie man einen Kreis macht hab ich rausgefunden aber einen Zylinder bekomm ich nicht hin 😞

    Meine Funktion zum erstellen eines Kreises:

    float x = 200;
    float y = 200;
    float radius = 100;
    int prec = 15;
    
       glBegin(GL_LINE_LOOP);  // GL_TRIANGLE_FAN
    
       float angle = 0; 
    
       if(prec < 3) prec = 3; 
    
       for(int i=0;i<prec;i++) 
       {    
          angle = 2*PI*i/prec; 
    	  glVertex2f(x+(radius*std::cos(angle)),y+(radius*std::sin(angle))); 
       } 
       glEnd();
    

    Doch wie bekomm ich nun einen Zylinder hin, der hol ist?



  • Du musst jetzt nur den gleichen Kreis nochmal erstellen bzw ihn kopieren und dann in z-Richtung verschieben. Dann kannst Du auch leicht die Verbindungsstreben zwischen den beiden Kreisen berechnen.

    Kommen in Deinem Spiel eigentlich nur Zylinder vor, die senkrecht stehen? Wenn ja wärst Du dann ja schon fertig.

    PS:
    Du kannst noch den Faktor 2*PI/prec aus der for-Schleife rausziehen. Kann ja sein, dass der Compiler das nicht macht.

    PPS:
    Wieso benutzt Du eigentlich 2D-Vertizes? Soll der Zylinder nicht 3-Dimensional erscheinen? (D.h soll es so aussehen wie zb die Kuchendiagramme in Excel)



  • Hi,

    ich habe es hinbekommen:

    void renderCylinder (float radius, int prec, float size, float x, float y, float z)
    				{
    					glBegin(GL_TRIANGLE_STRIP);
    
    					if(prec < 3) 
    						prec = 3; 
    
    					float angle = 0.0f; 
    
    						// Hier musste ich +1 rechnen
    					for(int i=0;i<prec+1;i++) 
    					{     
    						angle = 6.28318f*i/prec; 
    						glVertex3f((radius*std::cos(angle)),(radius*std::sin(angle)),-size/2); 
    						glVertex3f((radius*std::cos(angle)),(radius*std::sin(angle)),size/2); 
    					} 
    
    					glEnd();
    }
    

    wie kann man die funktion noch optimieren? also das PI*2 hab ich wegbekommen. Bzw. ist der code überhaupt so richtig? 🙂



  • Ich kenn mich mit OGL nicht aus. Wird dieser Code nur einmal beim Start augerufen oder in jedem Frame? Falls zweiteres würde ich die ganzen doppelten Berechnungen erstmal weglassen:

    glBegin(GL_TRIANGLE_STRIP);
    
        if(prec < 3) 
           prec = 3; 
    
        float angle = 0.0f; 
    
        ++prec; // Hier musste ich +1 rechnen
    
        float delta_angle = 6.28318f/prec;
    
        for(int i=0;i<prec;i++) 
        {     
            float x = radius*std::cos(angle);
            float y = radius*std::sin(angle);
            float z = size * 0.5f;
            glVertex3f(( x, y, -z); 
            glVertex3f(( x, y,  z);
            angle += delta_angle;
        } 
        glEnd();
    

    Wenn sich der Zylinder im Umfang nicht ändert kannst Du das ja auch alles irgendwo speichern.


Anmelden zum Antworten