PDA

View Full Version : Problems with rotation and drawing order



raven.nevermore
01-10-2012, 03:38 PM
Hi,

I am just starting with OpenGL, but have a fair bit of programming knowledge in other fields.

To get used to the API, I started drawing a simple rotating cube onto the screen.

My demo program draws the cube and rotates it, but there is a very odd problem, to which I have thus been unable to find an answer:

The cube is composed by individual quad faces. As soon as the rotation goes over a certain point, it seems, that OpenGL is drawing the back face on top of the front face, resulting in some weird escheresk geometry.

I added two screenshots to this post, to further illustrate the problem.

Also, the drawing function looks like this:

<div class="ubbcode-block"><div class="ubbcode-header">Click to reveal.. <input type="button" class="form-button" value="Show me!" onclick="toggle_spoiler(this, 'Yikes, my eyes!', 'Show me!')" />]<div style="display: none;">
- (void) draw:(int) delta_t{
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUADS);
{
glColor3f(1.0f,0.5f,0.0f); // Set The Color To Orange
glVertex3f(s,-1*s, s); // Top Right Of The Quad (Bottom)
glVertex3f(-1*s,-1*s, s); // Top Left Of The Quad (Bottom)
glVertex3f(-1*s,-1*s,-1*s); // Bottom Left Of The Quad (Bottom)
glVertex3f( s,-1*s,-1*s); // Bottom Right Of The Quad (Bottom)

glColor3f(0.0f,s,0.0f); // Set The Color To Green
glVertex3f( s, s,-1*s); // Top Right Of The Quad (Top)
glVertex3f(-1*s, s,-1*s); // Top Left Of The Quad (Top)
glVertex3f(-1*s, s, s); // Bottom Left Of The Quad (Top)
glVertex3f( s, s, s); // Bottom Right Of The Quad (Top)

glColor3f(s,0.0f,0.0f); // Set The Color To Red
glVertex3f(s,s,s); // Top Right Of The Quad (Front)
glVertex3f(-1*s,s,s); // Top Left Of The Quad (Front)
glVertex3f(-1*s,-1*s,s); // Bottom Left Of The Quad (Front)
glVertex3f(s,-1*s,s); // Bottom Right Of The Quad (Front)
/*glVertex3f(myTriangle.alpha_x+myTriangle.location _x,
myTriangle.alpha_y+myTriangle.location_y,
myTriangle.alpha_z);
glVertex3f(myTriangle.beta_x+myTriangle.location_x ,
myTriangle.beta_y+myTriangle.location_y,
myTriangle.beta_z);
glVertex3f(myTriangle.gamma_x+myTriangle.location_ x,
myTriangle.gamma_y+myTriangle.location_y,
myTriangle.gamma_z);*/
}
glEnd();
glRotatef(5, 1, 1, 1);

glFlush();
}
[/QUOTE]</div>

What am I doing wrong here? Do I really need to change the order of the faces halfway through an animation? Is there maybe a better attempt to rotation than this?


Thanks for the help and kind regards,

The Raven

mobeen
01-10-2012, 06:58 PM
It looks like the depth test is not enabled. Have u enabled the depth test?


glEnable(GL_DEPTH_TEST);

raven.nevermore
01-11-2012, 04:14 AM
Indead, that was the problem.

At least when I code this, using GLUT, that gets rid of the problem.

Thanks.

Now I just have to find out, what Apple does different to GLUT, when using Cocoa; because for some reason, setting the depth test with only the glEnable call does not work inside a Cocoa view.

If anybody has an idea about that, I would be delighted to hear it.

Regards,
The Raven

ZbuffeR
01-11-2012, 07:06 AM
Are you sure you request a depth buffer at the windows creation ?
Otherwise some GL implementations can provide one even if not asked, but not the case everywhere.
Be sure to ask for everything you need, ie RGBA 8 bits per component, depth buffer 24 bits, double buffering, and maybe stencil 8 bits.