2016-12-30 3 views
1

Ich mache ein 3D-Projekt in OpenGL, die eine Masse enthalten (gezeichnet als Linienschleifen). Das Problem, das ich habe, ist, wenn das Projekt startet nur eine einzige Zeile wird im nächsten Bild wie dargestellt gezeichnet:Polylinie rendert nur nach Größenanpassung des Fensters

enter image description here

Wenn ich die Größe oder das Fenster maximieren dann die tatsächliche Masse wie folgt dargestellt wird:

enter image description here

Haben Sie eine Idee, wie Sie dieses Problem lösen können? Ich bin ein Anfänger in OpenGL-Programmierung. Hier

ist der Code:

void drawHook(void); 
void timer(int); 
void drawFlorr(); 
float L = 100; 

const int screenWidth = 1000;  // width of screen window in pixels 
const int screenHeight = 1000;  // height of screen window in pixels 
float ww = 800; 
float wh = 800; 
float f = 520, n = 10.0; 
static GLdouble ort1[] = { -200, 200, -33, 140 }; 
static GLdouble viewer[] = { 525, 25, -180 }; 
static GLdouble objec[] = { 525.0, 25, -350 }; 
float x, y = 0.0, z, z1; 
float xmax = screenWidth - 200.0; 
float zmax = screenWidth - 200.0; 
float xmin, zmin; 
float step = 5.0; 

float fov = 80; 

void myInit(void) 
{ 
     glClearColor(0.0,0.0,0.0,0.0);  // background color is white 

    glPointSize(2.0);     // a 'dot' is 2 by 2 pixels 
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity(); 
    gluOrtho2D(0.0, screenWidth, 0.0, screenHeight);//dino window 
    glViewport(0, 0, screenWidth, screenHeight); 

} 

void myDisplay(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 
    gluLookAt(viewer[0], viewer[1], viewer[2], objec[0], objec[1], objec[2], 0, 1, 0); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(fov, 1.333, n, f); 
    glPointSize(2.0); 
    glMatrixMode(GL_MODELVIEW); 

    drawFlorr(); 


    glutSwapBuffers(); 


} 

int main(int argc, char** argv) 
{ 

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // set display mode 
    glutInitWindowSize(screenWidth, screenHeight); // set window size 
    glutInitWindowPosition(10, 10); // set window position on screen 
    glutCreateWindow("Dino Line Drawing"); // open the screen window 
    glutDisplayFunc(myDisplay);  // register redraw function 
    myInit();    
    //glutTimerFunc(1,timer,1); 
    glutMainLoop();    // go into a perpetual loop 
    return 1; 
} 
void drawFlorr() 
{ 

    xmin = -100; 
    zmin = -100; 

    for (x = xmin; x < xmax; x += step) 
    { 
     for (z = zmin; z < zmax; z += step) 
     { 
      z1 = -z; 

      glBegin(GL_LINE_LOOP); 

      glVertex3f(x, y, z1); 
      glVertex3f(x, y, z1-step+1.0); 
      glVertex3f(x + step - 1.0, y, z1 - step + 1.0); 
      glVertex3f(x+step-1.0, y, z1); 

      glEnd(); 


     } 
    } 
} 

Antwort

2

Der Code wird in vielerlei Hinsicht gebrochen:

  1. Ihre myDisplay Funktion verwendet, was auch immer die aktuelle Matrix-Modus ist auf die Ansicht Matrix einzustellen. Zunächst
  2. , verlassen Sie den Matrix-Modus als GL_PROJECTION in myInit()

Diese beiden bedeuten zusammen, dass für den ersten Frame, die Sie gerade Identität verwenden, wie MODELVIEW Matrix, und nur die Projektionsmatrix zweimal überschreiben. Nach einer Größenänderung wird der Rahmen erneut gezeichnet und Ihr Code wird wahrscheinlich ausgeführt.

Allerdings gibt es mehr:

  1. Sie haben keine Resize-Handler, so dass Ihr Ansichtsfenster wird sich nicht ändern, wenn Sie die Größe des Fensters.
  2. Sie setzen eine ortho-Matrix initial für die Projektion, obwohl Sie nicht vorhaben, sie zu verwenden.

und der meisten Importpunkt:

  1. All des Codes hängt von Funktionalität, die bei allen in moderner OpenGL nicht einmal verfügbar ist veraltet. Eigentlich sollten Sie das 2016 nicht nutzen, sondern stattdessen modernes OpenGL lernen ("modern" bedeutet hier "nur ein Jahrzehnt alt").
+0

Und die klare Farbe ist nicht weiß. – BDL

+0

Danke @derhass für deine suggestion es funktioniert ich werde sicher folgen modernen Open gl <3 –

Verwandte Themen