PDA

View Full Version : Problem with Vincent 3D Library and perspective projection



Bomber81
03-19-2009, 12:41 PM
Hi everyone.

I'm having some strange problems using Vincent 3D library 1.0 with windows mobile emulator. I have tried both Windows mobile 6 and pocket pc 2003 emulator.
The problem occur using perspective projection. When the camera is between the z-near and the z-far coordinates (where z is my depth axis) of a 3D solid, strange transformations occur.
The best way to explain is to show you a video: http://www.youtube.com/watch?v=HMgvZtc1Uog
The cube has x coordinate equal to -4.0, the camera does not pass thorugh it.
I tried the same animation on several code examples and i always got the same result. Also using UG lib instead of GLUT|ES same problem occurs

Where's the problem? Is is a library bug?!!

Here the relevant OpenGL code:


bool InitOGLES()
{
EGLConfig configs[10];
EGLint matchingConfigs;

/*configAttribs is a integers list that holds the desired format of
our framebuffer. We will ask for a framebuffer with 24 bits of
color and 16 bits of z-buffer. We also ask for a window buffer, not
a pbuffer or pixmap buffer*/
const EGLint configAttribs[] =
{
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, EGL_DONT_CARE,
EGL_DEPTH_SIZE, 16,
EGL_STENCIL_SIZE, EGL_DONT_CARE,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_NONE, EGL_NONE
};


hdc = GetWindowDC(hWnd);
glesDisplay = eglGetDisplay(hdc); //Ask for an available display

//Display initialization(donít care about the OGLES version numbers)
if(!eglInitialize(glesDisplay, NULL, NULL))
return false;

/*Ask for the framebuffer confiburation that best fits our
parameters. At most, we want 10 configurations*/
if(!eglChooseConfig(glesDisplay, configAttribs, &configs[0],
10, &matchingConfigs))
return false;

//If there isnít any configuration enough goodÖ
if (matchingConfigs < 1) return false;


glesSurface = eglCreateWindowSurface(glesDisplay, configs[0],
hWnd, configAttribs);

if(!glesSurface) return false;

// Letís create our rendering context
glesContext=eglCreateContext(glesDisplay,configs[0],0,configAttribs);

if(!glesContext) return false;

//Now we will activate the context for rendering
eglMakeCurrent(glesDisplay, glesSurface, glesSurface, glesContext);


glClearColor(255, 255, 255, 0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

RECT r;
GetWindowRect(hWnd, &r);
glViewport(r.left, r.top, r.right - r.left, r.bottom - r.top);

float ratio = (float)(r.right - r.left)/(r.bottom - r.top);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspectivef(45.0f, ratio, 0.1f, 1000.0f);
glMatrixMode(GL_MODELVIEW);

glEnableClientState(GL_VERTEX_ARRAY);
printf("Rendering...\n");

return true;
}
void render()
{
static GLubyte front[] = {2,1,3,0}; //front face
static GLubyte back[] = {5,6,4,7}; //back face
static GLubyte top[] = {6,2,7,3}; //top face
static GLubyte bottom[] = {1,5,0,4}; //bottom face
static GLubyte left[] = {3,0,7,4}; //left face
static GLubyte right[] = {6,5,2,1}; //right face

static GLshort vertices[] = {-1,-1,-1, 1,-1,-1, 1,1,-1, -1,1,-1,
-1,-1,1, 1,-1,1, 1,1,1, -1,1,1};
static GLfloat k = -20;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

gluLookAtf( 0,0,0,
0,0,-1,
0, 1, 0
);

glTranslatef(-4,0,k);
k += 0.1;

glVertexPointer(3, GL_SHORT, 0, vertices);

/*We are going to draw the cube, face by face, with different colors for
each face, using indexed vertex arrays and triangle strips*/
glColor4f(1,0,0,0);
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, front);

glColor4f(0,1,0,0);
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, back);

glColor4f(0,0,1,0);
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, top);

glColor4f(1,1,0,0);
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, bottom);

glColor4f(0,1,1,0);
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, left);

glColor4f(1,0,1,0);
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, right);


eglSwapBuffers(glesDisplay, glesSurface);
}

hmwill
03-19-2009, 03:36 PM
Make sure to comment out the following lines in ContextRender.cpp (671 + 672):

671 if (rasterPos->m_ClipCoords.w() < 0)
672 rasterPos->m_ClipCoords = -rasterPos->m_ClipCoords;

- HM

Bomber81
03-23-2009, 09:29 AM
Great! It works now. Thanks a lot!

hmwill
03-23-2009, 08:13 PM
You're welcome. I really need to get around re-releasing the library with a couple of bug fixes...

- HM