arctbl

02-27-2009, 11:21 AM

Hi

I am trying write a little program that displays a constant number of object in the view area at all times (currently point objects). I am using a frustum class that gives me the important view coordinates (it

is mostly from the Lighthouse View Frustum Culling Tutorial (http://www.lighthouse3d.com/opengl/viewfrustum/index.php)). It seems like it should be easy but the view remains splotchy with objects constantly blinking (being added to random positions) on screen.

Does anyone have any ideas?

Below is the function I use to redraw the objects. I can attach the rest of the application if it would help.

void cstarfield::weMove()

{

camera.MoveForward(g_speed);//forward is -z

camera.Render();//needs to be here for frustum

lftl = camera.ftl; lfbl=camera.fbl; lfbr=camera.fbr; lftr=camera.ftr;

lntl = camera.ntl; lnbl=camera.nbl; lnbr=camera.fbr; lntr=camera.ftr;

for ( int i = 0; i < NUM_STARS; i++ )

{

glPushMatrix();

glTranslatef( g_xyz[i][0], g_xyz[i][1], g_xyz[i][2] );

if (g_color==GL_TRUE)

glColor3fv( g_colors[i] );

else

glColor3f( 255,255,255);

glPointSize(g_pointsize); //sets the pixel size of the points

glBegin(GL_POINTS); // render with points

glVertex2i(0,0); //display a point at current x,y,z

glEnd();

glPopMatrix();

GLfloat lowest, highest, range;

GLfloat tmp;

Vec3 a( g_xyz[i][0], g_xyz[i][1], g_xyz[i][2] );

enum {TOP=0, BOTTOM,LEFT,RIGHT,NEARP,FARP};

if (camera.pointInFrustum(a) == CCamera::OUTSIDE)

//if star is outside of frustum then recalc to somewhere inside ...

{

GLfloat dn,df,dl,dr,dt,db, td;

dn=camera.pl[NEARP].distance(a);

df=camera.pl[FARP].distance(a);

dl=camera.pl[LEFT].distance(a);

dr=camera.pl[RIGHT].distance(a);

dt=camera.pl[TOP].distance(a);

db=camera.pl[BOTTOM].distance(a);

if (dl<0)

if (camera.ftl.x<camera.ftr.x)

g_xyz[i][0] = g_xyz[i][0]-dr;

else

g_xyz[i][0] = g_xyz[i][0]+dr;

if (dr<0)

if (camera.ftl.x<camera.ftr.x)

g_xyz[i][0] = g_xyz[i][0]+dl;

else

g_xyz[i][0] = g_xyz[i][0]-dl;

if (dt<0)

if (camera.ftl.y>camera.fbl.y)

g_xyz[i][1] = g_xyz[i][1]-db;

else

g_xyz[i][1] = g_xyz[i][1]+db;

if (db<0)

if (camera.ftl.y>camera.fbl.y)

g_xyz[i][1] = g_xyz[i][1]+dt;

else

g_xyz[i][1] = g_xyz[i][1]-dt;

if (df<0)

if (camera.ftl.z>camera.ntl.z)

g_xyz[i][2] = g_xyz[i][2]-dn;

else

g_xyz[i][2] = g_xyz[i][2]+dn;

if (dn<0)

if (camera.ftl.z>camera.ntl.z)

g_xyz[i][2] = g_xyz[i][2]-df;

else

g_xyz[i][2] = g_xyz[i][2]+df;

Vec3 d(g_xyz[i][0], g_xyz[i][1], g_xyz[i][2]);

if (camera.pointInFrustum(d) == CCamera::OUTSIDE)

{

lowest=dl; highest=dr;

if (lowest> highest){tmp=lowest;lowest=highest;highest=tmp; }

range=(highest-lowest)+1;

g_xyz[i][0] = lowest+int(range*rand()/(RAND_MAX + 1.0));

lowest=db; highest=dt;

if (lowest> highest){tmp=lowest;lowest=highest;highest=tmp; }

range=(highest-lowest)+1;

g_xyz[i][1] = lowest+int(range*rand()/(RAND_MAX + 1.0));

lowest=dn; highest=df;

if (lowest> highest){tmp=lowest;lowest=highest;highest=tmp; }

range=(highest-lowest)+1;

g_xyz[i][2] = lowest+int(range*rand()/(RAND_MAX + 1.0));

}

}

I am trying write a little program that displays a constant number of object in the view area at all times (currently point objects). I am using a frustum class that gives me the important view coordinates (it

is mostly from the Lighthouse View Frustum Culling Tutorial (http://www.lighthouse3d.com/opengl/viewfrustum/index.php)). It seems like it should be easy but the view remains splotchy with objects constantly blinking (being added to random positions) on screen.

Does anyone have any ideas?

Below is the function I use to redraw the objects. I can attach the rest of the application if it would help.

void cstarfield::weMove()

{

camera.MoveForward(g_speed);//forward is -z

camera.Render();//needs to be here for frustum

lftl = camera.ftl; lfbl=camera.fbl; lfbr=camera.fbr; lftr=camera.ftr;

lntl = camera.ntl; lnbl=camera.nbl; lnbr=camera.fbr; lntr=camera.ftr;

for ( int i = 0; i < NUM_STARS; i++ )

{

glPushMatrix();

glTranslatef( g_xyz[i][0], g_xyz[i][1], g_xyz[i][2] );

if (g_color==GL_TRUE)

glColor3fv( g_colors[i] );

else

glColor3f( 255,255,255);

glPointSize(g_pointsize); //sets the pixel size of the points

glBegin(GL_POINTS); // render with points

glVertex2i(0,0); //display a point at current x,y,z

glEnd();

glPopMatrix();

GLfloat lowest, highest, range;

GLfloat tmp;

Vec3 a( g_xyz[i][0], g_xyz[i][1], g_xyz[i][2] );

enum {TOP=0, BOTTOM,LEFT,RIGHT,NEARP,FARP};

if (camera.pointInFrustum(a) == CCamera::OUTSIDE)

//if star is outside of frustum then recalc to somewhere inside ...

{

GLfloat dn,df,dl,dr,dt,db, td;

dn=camera.pl[NEARP].distance(a);

df=camera.pl[FARP].distance(a);

dl=camera.pl[LEFT].distance(a);

dr=camera.pl[RIGHT].distance(a);

dt=camera.pl[TOP].distance(a);

db=camera.pl[BOTTOM].distance(a);

if (dl<0)

if (camera.ftl.x<camera.ftr.x)

g_xyz[i][0] = g_xyz[i][0]-dr;

else

g_xyz[i][0] = g_xyz[i][0]+dr;

if (dr<0)

if (camera.ftl.x<camera.ftr.x)

g_xyz[i][0] = g_xyz[i][0]+dl;

else

g_xyz[i][0] = g_xyz[i][0]-dl;

if (dt<0)

if (camera.ftl.y>camera.fbl.y)

g_xyz[i][1] = g_xyz[i][1]-db;

else

g_xyz[i][1] = g_xyz[i][1]+db;

if (db<0)

if (camera.ftl.y>camera.fbl.y)

g_xyz[i][1] = g_xyz[i][1]+dt;

else

g_xyz[i][1] = g_xyz[i][1]-dt;

if (df<0)

if (camera.ftl.z>camera.ntl.z)

g_xyz[i][2] = g_xyz[i][2]-dn;

else

g_xyz[i][2] = g_xyz[i][2]+dn;

if (dn<0)

if (camera.ftl.z>camera.ntl.z)

g_xyz[i][2] = g_xyz[i][2]-df;

else

g_xyz[i][2] = g_xyz[i][2]+df;

Vec3 d(g_xyz[i][0], g_xyz[i][1], g_xyz[i][2]);

if (camera.pointInFrustum(d) == CCamera::OUTSIDE)

{

lowest=dl; highest=dr;

if (lowest> highest){tmp=lowest;lowest=highest;highest=tmp; }

range=(highest-lowest)+1;

g_xyz[i][0] = lowest+int(range*rand()/(RAND_MAX + 1.0));

lowest=db; highest=dt;

if (lowest> highest){tmp=lowest;lowest=highest;highest=tmp; }

range=(highest-lowest)+1;

g_xyz[i][1] = lowest+int(range*rand()/(RAND_MAX + 1.0));

lowest=dn; highest=df;

if (lowest> highest){tmp=lowest;lowest=highest;highest=tmp; }

range=(highest-lowest)+1;

g_xyz[i][2] = lowest+int(range*rand()/(RAND_MAX + 1.0));

}

}