| Reaper Veteran Member
 
      
 
  
 Posts: 1389
 Reputation: 23
 37 /
  /  Joined: Jun 2004
 
 | | O.P.  C++ Help I'm doing a bit of coding with C++ and OpenGL. 
I'm using cubic bezier curves. I having a some trouble. Instead of using lines to draw the curves, I want to use cubes. I've managed to changed it but when I draw 1 curve, it shows many cubes spaced out.  
How can I get the cubes to stay together?
 code:/* Draw x , y and z axis */
 
 
 #include <stdlib.h>
 #include <glut.h>        //OpenGL library
 
 GLfloat Ax,Bx,Cx,Dx,Ay,By,Cy,Dy,Az,Bz,Cz,Dz,x1,k,l,x2,y2,z2,t,p,constx1,consty1,constz1;
 int i;
 
 /* define a draw routine to draw the x,y and z axis */
 void drawaxis(void) /*x,y,z*/
 {
 // x coordinates to draw the x axis
 GLdouble x1[3] = {-100.0, 0.0, 0.0}; // define coordinates as an array
 GLdouble x2[3] = {50.0, 0.0, 0.0};  //GLdouble opengl varaible for storing doubles
 
 // y coordinates to draw the y axis
 GLdouble y1[3] = {0.0, -100.0, 0.0};
 GLdouble y2[3] = {0.0, 50.0, 0.0};
 
 // z coordinates to draw the z axis
 GLdouble z1[3] = {0.0, 0.0, -100.0};
 GLdouble z2[3] = {0.0, 0.0, 50.0};
 
 
 glBegin(GL_LINES);
 glColor3f(1.0, 0.0, 0.0);  //give different color to the three axis, red for x axis
 glVertex3dv(x1);
 glVertex3dv(x2);
 glColor3f(0.0, 1.0, 0.0); //give green color to y axis
 glVertex3dv(y1);
 glVertex3dv(y2);
 glColor3f(1.0, 1.0, 1.0); //give white color to z axis
 glVertex3dv(z1);
 glVertex3dv(z2);
 glEnd();
 
 }
 // define the Bezier routine here
 void DrawBezier(float firstx1,float firsty1,float firstz1,float lastx2,float lasty2,float lastz2,float conx1, float cony1,float conz1,float conx2,float cony2,float conz2)
 {
 Ax =lastx2 -firstx1-3*conx2+3*conx1;
 Bx = 3*firstx1 -6*conx1 +3*conx2;
 Cx=-3*firstx1+3*conx1;
 Dx=firstx1;
 Ay =lasty2 -firsty1-3*cony2+3*cony1;
 By = 3*firsty1 -6*cony1 +3*cony2;
 Cy=-3*firsty1+3*cony1;
 Dy=firsty1;
 Az =lastz2 -firstz1-3*conz2+3*conz1;
 Bz = 3*firstz1 -6*conz1 +3*conz2;
 Cz=-3*firstz1+3*conz1;
 Dz=firstz1;
 // now draw the curve
 for (t=0.0;t<=1.0 ; t=t+0.05)
 {
 x1=Ax*t*t*t +Bx*t*t + Cx*t + Dx;
 k =Ay*t*t*t +By*t*t + Cy*t + Dy;
 l =Az*t*t*t +Bz*t*t + Cz*t + Dz;
 p=t+0.05;
 x2=Ax*p*p*p +Bx*p*p + Cx*p + Dx;
 y2=Ay*p*p*p +By*p*p + Cy*p + Dy;
 z2=Az*p*p*p +Bz*p*p + Cz*p + Dz;
 glLineWidth(5);
 glTranslatef(x1,k,l);
 glutSolidCube(1);
 }
 
 }
 
 
 
 
 
 
 
 
 /* reshape callback function  executed when window is moved or resized */
 void reshape(int width, int height)
 {
 glViewport(0, 0, width, height);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(50.0,1.0,15.0,350.0);  //Perspective
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 }
 
 
 /* display routine this where the drawing takes place  */
 void display(void)
 {
 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   /* clear window */
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 
 gluLookAt(50.0, 20.0, 50.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);  //position of the eye
 drawaxis();  // draw the coordinate axis
 //draw Bezier curve here notice use of z coordinates in the control points
 
 //DrawBezier(-5,10,10,5,10,10,1.5,10,10,3.5,10,10); //first arc
 //DrawBezier(-10,13,10,0,10,10,-2.5,10.5,10,-7.5,12.5,10); //second arc
 
 //DrawBezier(0,0,0,1,0,0,0.25,0,0,0.75,0,0);
 DrawBezier(5,0,0,10,2,0,6.25,0.5,0,8.25,1.5,0);
 //DrawBezier(10,2,0,15,4,0,11.25,2.5,0,13.75,3.5,0);
 //DrawBezier(0,0,0,0,0,0,0,0,0,0,0,0);
 
 glutSwapBuffers();
 glFlush();
 }
 
 /* graphics initialisation */
 void init(void)
 {
 glClearColor (0.0, 0.0, 0.0, 0.0);   /* window will be cleared to black */
 glEnable(GL_DEPTH_TEST);
 glEnable(GL_CULL_FACE);  // Enable back  culling
 glCullFace(GL_BACK);     // Cull back faces
 
 }
 
 
 int main(int argc, char** argv)
 {
 /* window management code ... */
 /* initialises GLUT and processes any command line arguments */
 glutInit(&argc, argv);
 /* use single-buffered window and RGBA colour model */
 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
 /* enable the depth test */
 glEnable(GL_DEPTH_TEST);
 /* window width = 600 pixels, height = 600 pixels */
 glutInitWindowSize (600, 600);
 /* window upper left corner at (0, 0) */
 glutInitWindowPosition (0, 0);
 /* creates an OpenGL window with command argument in its title bar */
 glutCreateWindow ("Opening Window");
 init();
 glutDisplayFunc(display);
 glutReshapeFunc(reshape);
 glutMainLoop();
 return 0;
 }
 
 
 
(You need OpenGL installed to be able to run this) | 
 |