Note that there are some explanatory texts on larger screens.

plurals
  1. POopengl dynamic bezier curve has gaps - glEvalCoord1f();
    primarykey
    data
    text
    <p>I like to have a program where you can pick ten points and then a bezier curve is calculated for that points. It seems to work pretty perfect, but the shown curve has some gaps. I used <code>GL_LINE_STRIP</code> how is it possible that the points are not connected?</p> <p>I figured out, that a very small <code>u</code> in <code>glEvalCoord1f(u);</code> makes the gaps smaller. How is <code>u</code> depending on controlpoints and window propperties in <code>glEvalCoord1f(u);</code> ?</p> <p><img src="https://i.stack.imgur.com/zCQtO.png" alt="Beziere gaps Line width 1"></p> <p>[Edit] Added Screen with thicker lines: <img src="https://i.stack.imgur.com/oCaoW.png" alt="Beziere gaps Line width 3"></p> <pre><code>#include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;string&gt; #include &lt;fstream&gt; #include &lt;math.h&gt; #include &lt;time.h&gt; #include &lt;GL/glut.h&gt; //added GL prefix for Ubuntu compatibility #define MAXP 10 GLint nNumPoints = 0; GLfloat ctrlpoints[10][3]; GLdouble mouseOgl[3] = {0.0,0.0,0.0}; GLint mouseX, mouseY; bool mousePressed = false; void GetOGLPos(int x, int y); void init(void) { glClearColor(1.0, 1.0, 1.0, 0.0); glShadeModel(GL_FLAT); // Enable the evaluator glEnable(GL_MAP1_VERTEX_3); glEnable(GL_DEPTH); } void display(void) { int i; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(0.0, 0.0, 1.0); if(mousePressed &amp;&amp; nNumPoints &lt; MAXP){ GetOGLPos(mouseX, mouseY); std::cout &lt;&lt; mouseOgl[0] &lt;&lt; " # " &lt;&lt; mouseOgl[1] &lt;&lt; " # " &lt;&lt; mouseOgl[2] &lt;&lt; " # " &lt;&lt; std::endl; nNumPoints++; ctrlpoints[nNumPoints-1][0] = mouseOgl[0]; ctrlpoints[nNumPoints-1][3] = mouseOgl[1]; ctrlpoints[nNumPoints-1][2] = mouseOgl[2]; } //Curves if( nNumPoints == MAXP ){ glMap1f(GL_MAP1_VERTEX_3, // Type of data generated 0.0f, // Lower u range 1.0f, // Upper u range 3, // Distance between points in the data 3: ...Z-X-Y-Z... nNumPoints, // number of control points &amp;ctrlpoints[0][0]); // start point glBegin(GL_LINE_STRIP); float max = pow(MAXP,4)*2; //accuracy of pint calulation? for (i = 0; i &lt;= max; i++) glEvalCoord1f((GLfloat) (i/max)); //high value to avoid gaps?!? glEnd(); } //Controllpoints: glPointSize(5.0); glColor3f(1.0, 0.0, 0.0); glBegin(GL_POINTS); for (i = 0; i &lt; nNumPoints; i++) glVertex3fv(&amp;ctrlpoints[i][0]); glEnd(); //Lines glColor3f(0.0, 1.0, 0.0); glBegin(GL_LINE_STRIP); for (i = 0; i &lt; nNumPoints; i++) glVertex3fv(&amp;ctrlpoints[i][0]); glEnd(); if( nNumPoints == MAXP ){nNumPoints = 0;} glFlush(); } void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //keep aspect ratio: if (w &lt;= h) glOrtho(-2.0, 2.0, -2.0*(GLfloat)h/(GLfloat)w, 2.0*(GLfloat)h/(GLfloat)w, -2.0, 2.0); else glOrtho(-2.0*(GLfloat)w/(GLfloat)h, 2.0*(GLfloat)w/(GLfloat)h, -2.0, 2.0, -2.0, 2.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } //handle click events of the mouse void myMouse(int button, int state, int x, int y) { //mouse coords to gl coords mouseX = x; mouseY = y; switch (button) { case GLUT_LEFT_BUTTON: if(state == GLUT_UP){ //on release left mouse button std::cout &lt;&lt; x &lt;&lt; " * "&lt;&lt; y &lt;&lt; std::endl; mousePressed = true; glutPostRedisplay(); //redisplay and calculate gl coords } else { mousePressed = false; } break; } } // detailed information: // http://nehe.gamedev.net/article/using_gluunproject/16013/ void GetOGLPos(int x, int y) { //init vars: GLint viewport[4]; GLdouble modelview[16]; GLdouble projection[16]; GLfloat winX, winY, winZ; GLdouble posX, posY, posZ; //get gl specs glGetDoublev( GL_MODELVIEW_MATRIX, modelview ); //get Modelmatrix glGetDoublev( GL_PROJECTION_MATRIX, projection ); //get projection matrix glGetIntegerv( GL_VIEWPORT, viewport ); //get viewport values //calculate the gl mouseposition winX = (float)x; winY = (float)viewport[3] - (float)y; glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &amp;winZ ); gluUnProject( winX, winY, winZ, modelview, projection, viewport, &amp;posX, &amp;posY, &amp;posZ); mouseOgl[0] = posX; mouseOgl[1] = posY; mouseOgl[2] = posZ; } int main(int argc, char** argv) { glutInit(&amp;argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (600, 600); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(myMouse); glutMainLoop(); return 0; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload