Originally posted by Stonemaster:
[b]Vertex arrays seem to be the best thing for you: http://www.cs.rit.edu/~ncs/Courses/570/UserGuide/OpenGLonWin-15.html http://www.codecolony.de/opengl.htm#VertexArrays
See you,
-Stone.[/b]
Thanks for this. For the time being, I am not using vertex arrays. After reading the points from a file and triangulating them, what do I do to display the surface. I have written the following code - it somehow displays some totally weird surface. Please do help me. here is the code:
// arrayu of points
Point sites[NSITES];
// array of triangles
Triangle tri[NUMTRIS];
void normal (point3 p)
{
float d = 0;
int i;
for (i=0;i<3;i++) d += p[i]*p[i];
d = sqrt(d);
if (d>0)
{
for(i=0;i<3;i++) p[i] = p[i]/d;
}
}
void display ()
{
point3 b;
int i,v1,v2,v3;
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity ();
glTranslatef (-2,0,0);
printf ("
In display");
for (i=0;i<NUMTRIS;i++)
{
glBegin (GL_POLYGON);
v1 = tri[i].v1; v2 = tri[i].v2; v3 = tri[i].v3;
b[0] = sites[v1].x+sites[v2].x;
b[1] = sites[v1].y+sites[v2].y;
b[2] = sites[v1].z+sites[v2].z;
normal (b);
glColor3fv (b);
glNormal3fv (b);
glVertex3fv (b);
b[0] = sites[v2].x+sites[v3].x;
b[1] = sites[v2].y+sites[v3].y;
b[2] = sites[v2].z+sites[v3].z;
normal(b);
glColor3fv (b);
glNormal3fv (b);
glVertex3fv (b);
b[0] = sites[v3].x+sites[v1].x;
b[1] = sites[v3].y+sites[v1].y;
b[2] = sites[v3].z+sites[v1].z;
normal(b);
glColor3fv (b);
glNormal3fv (b);
glVertex3fv (b);
glEnd ();
}
glFlush ();
}
void myReshape (int w, int h)
{
glViewport (0,0,w,h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
if (w <= h)
glOrtho (-4,4,-4*(GLfloat)h/(GLfloat)w,4*(GLfloat)h/(GLfloat)w,
-10,10);
else
glOrtho (-4*(GLfloat)w/(GLfloat)h,4*(GLfloat)w/(GLfloat)h,-4,4,-10,10);
glMatrixMode (GL_MODELVIEW);
display ();
}
void myinit ()
{
GLfloat mat_specular = {1,1,1,1};
GLfloat mat_diffuse = {1,1,1,1};
GLfloat mat_ambient = {1,1,1,1};
GLfloat mat_shininess = {100};
GLfloat light_ambient = {0,0,0,1};
GLfloat light_diffuse = {1,1,1,1};
GLfloat light_specular = {1,1,1,1};
glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular);
glMaterialfv (GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv (GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv (GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv (GL_FRONT, GL_SHININESS, mat_shininess);
glEnable (GL_SMOOTH);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
glEnable (GL_NORMALIZE);
glClearColor (1,1,1,1);
glColor3f (0,0,0);
}
int main(int argc, char **argv)
{
int i;
glutInit (&argc, argv);
// read the points into the array “sites”
// obtain the triangles into the array “Tri” (contains indices into the array called “sites”).
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (400,400);
glutCreateWindow ("sphere");
myinit ();
glutReshapeFunc (myReshape);
glutDisplayFunc (display);
glutMainLoop ();
return(0);
}