• Create Account

### #ActualFXACE

Posted 14 May 2012 - 08:00 PM

This formula would be useful for you in near future but for this you don't really need that.
Let me show you complete example:
// Set up projection
glMatrixMode(GL_PROJECTION);
gluPerspective(...);
glMatrixMode(GL_MODELVIEW);
// place your view to look at
DrawScene();
double proj[16];
double mv[16];
int vp[4];
glGetDoublev(GL_MODELVIEW_MATRIX, mv);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
glGetIntegerv(GL_VIEWPORT, vp);
double pos[3] = {0, 0, 0}; // position of your icon in 3D space
double wpos[3];

gluProject(pos[0], pos[1], pos[2], mv, proj, vp, &wpos[0], &wpos[1], &wpos[2]);
wpos[2] *= -1; // negate z value because OpenGL's forward axis is '-Z'
double iconSize = 50;

// go to orthogonal projection
glMatrixMode(GL_PROJECTION);
glOrtho(0, vp[2], 0, vp[3], 0,1);
glMatrixMode(GL_MODELVIEW);

glBegin(GL_QUADS); // simple actions
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glEnd();

And finally you will get nice quad which would be drawn as you wanted (depth tested and culled).

Does that make sense? The only part that is still confusing me is whether or not the billboard corners can correctly have the same z value as the center point that was returned through gluProject? I think I might be imagining it wrong, but in perspective mode if I ran a ray from the camera to the center of the billboard, it would get a different distance than a ray from camera to a corner, so I would think the depth values would be different as well.

Does the perspective depth buffer somehow make the depths 'normalized' from a plane the camera is on perpendicular to its line of sight, or do the depths represent distance from the actual spot the camera sits?

Nope, any vertex is clipped by planes (left, right, bottom, top, near, far). In orthogonal projection distance of center, corner of billboard to near (&far) plane are equivalent. OpenGL doesn't have a camera, it has a view port (where you move/transform all vertices into, by using of matrices, etc)
But with shaders you can construct a depth buffer as you wish...

Best wishes, FXACE.

### #8FXACE

Posted 14 May 2012 - 07:57 PM

This formula would be useful for you in near future but for this you don't really need that.
Let me show you complete example:
// Set up projection
glMatrixMode(GL_PROJECTION);
gluPerspective(45, double(Width)/double(Height), 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
DrawScene();
double proj[16];
double mv[16];
int vp[4];
glGetDoublev(GL_MODELVIEW_MATRIX, mv);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
glGetIntegerv(GL_VIEWPORT, vp);
double pos[3] = {0, 0, 0}; // position of your icon in 3D space
double wpos[3];

gluProject(pos[0], pos[1], pos[2], mv, proj, vp, &wpos[0], &wpos[1], &wpos[2]);
wpos[2] *= -1; // negate z value because OpenGL's forward axis is '-Z'
double iconSize = 50;

// go to orthogonal projection
glMatrixMode(GL_PROJECTION);
glOrtho(0, vp[2], 0, vp[3], 0,1);
glMatrixMode(GL_MODELVIEW);

glBegin(GL_QUADS); // simple actions
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glEnd();

And finally you will get nice quad which would be drawn as you wanted (depth tested and culled).

Does that make sense? The only part that is still confusing me is whether or not the billboard corners can correctly have the same z value as the center point that was returned through gluProject? I think I might be imagining it wrong, but in perspective mode if I ran a ray from the camera to the center of the billboard, it would get a different distance than a ray from camera to a corner, so I would think the depth values would be different as well.

Does the perspective depth buffer somehow make the depths 'normalized' from a plane the camera is on perpendicular to its line of sight, or do the depths represent distance from the actual spot the camera sits?

Nope, any vertex is clipped by planes (left, right, bottom, top, near, far). In orthogonal projection distance of center, corner of billboard to near (&far) plane are equivalent. OpenGL doesn't have a camera, it has a view port (where you move/transform all vertices into, by using of matrices, etc)
But with shaders you can construct a depth buffer as you wish...

Best wishes, FXACE.

### #7FXACE

Posted 14 May 2012 - 07:56 PM

This formula would be useful for you in near future but for this you don't really need that.
Let me show you complete example:
// Set up projection
glMatrixMode(GL_PROJECTION);
gluPerspective(45, double(Width)/double(Height), 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
DrawScene();
double proj[16];
double mv[16];
int vp[4];
glGetDoublev(GL_MODELVIEW_MATRIX, mv);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
glGetIntegerv(GL_VIEWPORT, vp);
double pos[3] = {0, 0, 0}; // position of your icon in 3D space
double wpos[3];

gluProject(pos[0], pos[1], pos[2], mv, proj, vp, &wpos[0], &wpos[1], &wpos[2]);
wpos[2] *= -1; // negate z value because OpenGL's forward axis is '-Z'
double iconSize = 50;

// go to orthogonal projection
glMatrixMode(GL_PROJECTION);
glOrtho(0, vp[2], 0, vp[3], 0,1);
glMatrixMode(GL_MODELVIEW);

glBegin(GL_QUADS); // simple actions
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glEnd();

And finally you will get nice quad which would be drawn as you wanted (depth tested and culled).

Does that make sense? The only part that is still confusing me is whether or not the billboard corners can correctly have the same z value as the center point that was returned through gluProject? I think I might be imagining it wrong, but in perspective mode if I ran a ray from the camera to the center of the billboard, it would get a different distance than a ray from camera to a corner, so I would think the depth values would be different as well.

Does the perspective depth buffer somehow make the depths 'normalized' from a plane the camera is on perpendicular to its line of sight, or do the depths represent distance from the actual spot the camera sits?

Nope, any vertex is clipped by planes (left, right, bottom, top, near, far). In orthogonal projection distance of center, corner of billboard to near (&far) plane are equivalent. OpenGL doesn't have a camera, it has a view port (where you move/transform all vertices into, by using of matrices, etc)
But with shaders you can construct a depth buffer by formula (or better):
gl_FragDepth = distance(camera_position, vertex_position);


Best wishes, FXACE.

### #6FXACE

Posted 14 May 2012 - 07:55 PM

This formula would be useful for you in near future but for this you don't really need that.
Let me show you complete example:
// Set up projection
glMatrixMode(GL_PROJECTION);
gluPerspective(45, double(Width)/double(Height), 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
DrawScene();
double proj[16];
double mv[16];
int vp[4];
glGetDoublev(GL_MODELVIEW_MATRIX, mv);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
glGetIntegerv(GL_VIEWPORT, vp);
double pos[3] = {0, 0, 0}; // position of your icon in 3D space
double wpos[3];

gluProject(pos[0], pos[1], pos[2], mv, proj, vp, &wpos[0], &wpos[1], &wpos[2]);
wpos[2] *= -1; // negate z value because OpenGL's forward axis is '-Z'
double iconSize = 50;

// go to orthogonal projection
glMatrixMode(GL_PROJECTION);
glOrtho(0, vp[2], 0, vp[3], 0,1);
glMatrixMode(GL_MODELVIEW);

glBegin(GL_QUADS); // simple actions
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glEnd();

And finally you will get nice quad which would be drawn as you wanted (depth tested and culled).

Does that make sense? The only part that is still confusing me is whether or not the billboard corners can correctly have the same z value as the center point that was returned through gluProject? I think I might be imagining it wrong, but in perspective mode if I ran a ray from the camera to the center of the billboard, it would get a different distance than a ray from camera to a corner, so I would think the depth values would be different as well.

Does the perspective depth buffer somehow make the depths 'normalized' from a plane the camera is on perpendicular to its line of sight, or do the depths represent distance from the actual spot the camera sits?

Nope, any vertex is clipped by planes (left, right, bottom, top, near, far). In orthogonal projection distance of center, corner of billboard to near (&far) plane are equivalent.OpenGL has not camera, it has viewport (where you move the vertices into, by using of matrices, etc)
But with shaders you can construct a depth buffer by formula (or better):
gl_FragDepth = distance(camera_position, vertex_position);


Best wishes, FXACE.

### #5FXACE

Posted 14 May 2012 - 07:51 PM

This formula would be useful for you in near future but for this you don't really need that.
Let me show you complete example:
// Set up projection
glMatrixMode(GL_PROJECTION);
gluPerspective(45, double(Width)/double(Height), 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
DrawScene();
double proj[16];
double mv[16];
int vp[4];
glGetDoublev(GL_MODELVIEW_MATRIX, mv);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
glGetIntegerv(GL_VIEWPORT, vp);
double pos[3] = {0, 0, 0}; // position of your icon in 3D space
double wpos[3];

gluProject(pos[0], pos[1], pos[2], mv, proj, vp, &wpos[0], &wpos[1], &wpos[2]);
wpos[2] *= -1; // negate z value because OpenGL's forward axis is '-Z'
double iconSize = 50;

// go to orthogonal projection
glMatrixMode(GL_PROJECTION);
glOrtho(0, vp[2], 0, vp[3], 0,1);
glMatrixMode(GL_MODELVIEW);

glBegin(GL_QUADS); // simple actions
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glEnd();

And finally you will get nice quad which would be drawn as you wanted (depth tested and culled).

Does that make sense? The only part that is still confusing me is whether or not the billboard corners can correctly have the same z value as the center point that was returned through gluProject? I think I might be imagining it wrong, but in perspective mode if I ran a ray from the camera to the center of the billboard, it would get a different distance than a ray from camera to a corner, so I would think the depth values would be different as well.

Does the perspective depth buffer somehow make the depths 'normalized' from a plane the camera is on perpendicular to its line of sight, or do the depths represent distance from the actual spot the camera sits?

Nope, any vertex is clipped by planes (left, right, bottom, top, near, far). In orthogonal projection distance of center, corner of billboard to near (&far) plane are equivalent.
But with shaders you can construct a depth buffer by formula (or better):
gl_FragDepth = distance(camera_position, vertex_position);


Best wishes, FXACE.

### #4FXACE

Posted 14 May 2012 - 07:50 PM

This formula would be useful for you in near future but for this you don't really need that.
Let me show you complete example:
// Set up projection
glMatrixMode(GL_PROJECTION);
gluPerspective(45, double(Width)/double(Height), 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
DrawScene();
double proj[16];
double mv[16];
int vp[4];
glGetDoublev(GL_MODELVIEW_MATRIX, mv);
glGetDoublev(GL_PROJECTION_MATRIX, proj);
glGetIntegerv(GL_VIEWPORT, vp);
double pos[3] = {0, 0, 0}; // position of your icon in 3D space
double wpos[3];

gluProject(pos[0], pos[1], pos[2], mv, proj, vp, &wpos[0], &wpos[1], &wpos[2]);
wpos[2] *= -1; // negate z value because OpenGL's forward axis is '-Z'
double iconSize = 50;

// go to orthogonal projection
glMatrixMode(GL_PROJECTION);
glOrtho(0, vp[2], 0, vp[3], 0,1);
glMatrixMode(GL_MODELVIEW);

glBegin(GL_QUADS); // simple actions
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] - 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] + 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glVertex3d(wpos[0] - 1 * iconSize, wpos[1] + 1 * iconSize, wpos[2]);
glEnd();

And finally you will get nice quad which would be drawn as you wanted (depth tested and culled).

Does that make sense? The only part that is still confusing me is whether or not the billboard corners can correctly have the same z value as the center point that was returned through gluProject? I think I might be imagining it wrong, but in perspective mode if I ran a ray from the camera to the center of the billboard, it would get a different distance than a ray from camera to a corner, so I would think the depth values would be different as well.

Does the perspective depth buffer somehow make the depths 'normalized' from a plane the camera is on perpendicular to its line of sight, or do the depths represent distance from the actual spot the camera sits?

Nope, any vertex is clipped by planes (left, right, bottom, top, near, far). In orthogonal projection distance of center, corner of billboard to near plane are equivalent.
But with shaders you can construct a depth buffer by formula (or better):
gl_FragDepth = distance(camera_position, vertex_position);


Best wishes, FXACE.

PARTNERS