Hi, I'm relatively new to OOP/C++/Opengl. Thanks in advance.
I want to create multiple Bezier curves in a OOP class structure. Eventually I would like to create multiple bezier curves with different attributes like x, y position, line thickness, etc.
I'm having difficulty with pointer/array portion. I want to create an array of 100 bezier curves. These individual curves are set up in an 6x3 array. I'm getting 2 errors.
My code:
#include <windows.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream.h>
#include <time.h>
//function prototypes
//Define bezier class for animation
class BezierClass {
public:
float x1,y1;
float x2,y2;
float x_cp1,y_cp1;
float x_cp2,y_cp2;
float x_cp3,y_cp3;
float x_cp4,y_cp4;
float xpos,ypos;
BezierClass() {
float bezierArray[6][3] =
{ {x1, y1, 0.0}, /* 1st End Point */
{x_cp1, y_cp1, 0.0}, /* 1st Control P. */
{x_cp2, y_cp2, 0.0}, /* 2nd Control P. */
{x_cp3, y_cp3, 0.0}, /* 3rd Control P. */
{x_cp4, y_cp4, 0.0}, /* 3th Control P. */
{x2, y2, 0.0} }; /* 2nd End Point */;
}
};
/* Create an array of type bezierClass that may hold 100 beziers */
BezierClass bezierArray[100];
int beziernum=0;
int totalbezier=5;
float zoom = -7;
void InitGL(int Width, int Height)
{
glClearDepth(1.0);
glClearColor(0.0, 0.0, 0.0, 0.0); /* bg color = black */
glDepthFunc(GL_LESS); /* nearer appears nearer */
glEnable(GL_DEPTH_TEST); /* enable depth testing */
glShadeModel(GL_SMOOTH); /* shade colors smooth */
glMatrixMode(GL_PROJECTION
); /* switch the matrix */
glLoadIdentity(); /* reset the cur. matrix */
gluPerspective(45.0f,(GLfl
oat)Width/
(GLfloat)H
eight,0.1f
,100.0f);
glMatrixMode(GL_MODELVIEW)
; /* switch matrix back */
}
void DrawGLScene(void)
{
int i; /* temp var */
/* Clear the screen and the buffers */
glClear(GL_COLOR_BUFFER_BI
T | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); /* reset cur. matrix */
glTranslatef(0.0f, 0.0f, -10.0f); /* move the cam */
/* ok, this is the main point of our bezier curve
* void glMap1f(GLenum target, float u1, float u2, int stride
* int order, const float *points);
* target is one of these:
* GL_MAP1_VERTEX_3 (Vertex Coordinates (xyz))
* GL_MAP1_VERTEX_4 (Vertex Coordinates (xyzw))
* GL_MAP1_INDEX (Color Index)
* GL_MAP1_COLOR_4 (Color Values (rgba))
* GL_MAP1_NORMAL (Normal Coordinates)
* GL_MAP1_TEXTURE_COORD_1/2/
3/4 (Texture Coordinates(s/st/str/strq)
*
* no idea what u1 and u2 these are, but it works with 0.0 and 1.0
* stride is the distance between each point on the curve
* order should always just fit the number of the points
* points is just a pointer to the pointdata(array)*/
////********error here: says "pointer/array required"//////////////
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 6, &bezierArray[0][0]);
glEnable(GL_MAP1_VERTEX_3)
; /* enable the mode */
glColor3f(1.0, 1.0, 1.0); /* set color to white */
glBegin(GL_LINE_STRIP); /* start drawing */
for(i = 0; i <= 60; i++)
{
/* start evaluating the points
* void glEvalCoord1f(float u);
* u is the current point we evaluate */
glEvalCoord1f((float)i/60.
0f);
}
glEnd(); /* stop drawing */
glPointSize(3.0); /* set point size to 3px */
glColor3f(1.0f, 1.0f, 0.0f); /* set color to yellow */
glBegin(GL_POINTS); /* start drawing again */
for(i = 0; i < 6; i++)
{
/* draw all control/end points */
////********error here: says "pointer/array required"//////////////
glVertex3fv(&bezierArray[i
][0]);
}
glEnd();
glFlush(); /* Flush all buffers */
glutSwapBuffers(); /* Sawp buffers */
return;
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLint) w, (GLint) h);
glMatrixMode(GL_PROJECTION
);
glLoadIdentity();
if ( h==0)
gluPerspective(45, (GLdouble)w, 1.0, 100.0);
else
gluPerspective(45, (GLdouble)w/(GLdouble)h,1.
0, 100.0);
glMatrixMode(GL_MODELVIEW)
;
glLoadIdentity();
}
//test-trying to make the bezier curve move in y direction.
void idle_func (void)
{
for (beziernum=0 ;beziernum < 100; beziernum++) {
//bezierArray[beziernum].y
pos+=1;
}
glutPostRedisplay();
}
/* Main Loop
* Open window with initial window size, title bar,
* RGBA display mode, and handle input events.
*/
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_R
GB | GLUT_DOUBLE);
glutInitWindowSize (800, 600);
glutCreateWindow (argv[0]);
glutReshapeFunc (reshape);
glutDisplayFunc (DrawGLScene);
glutIdleFunc (idle_func);
glutMainLoop();
return 0;
}
//end of code
Start Free Trial