Hello,
I am working on a scientific visualization program to display map of polar data using color as the Z-dimension (like a topo-map). I have selected OpenGL using an Orthographic projection and I am constructing the map using a combination of TRI_FAN and TRI_STRIP primitives having color coded indices (sample code below).
Everything works great if I leave the coordinates of the projection matrix “large” (or zoomed out); e.g., I am viewing the entire polar map of data. But if I try to reduce the bounds of the projection matrix or effectively, to zoom in on some area - say the upper quadrant of the map - I start seeing what look like rendering problems. I will observe black triangles and the edges of the map become very odd. The distortion doesn’t appear to be be quantization/rounding artifacts.
I’ve tried various hardware configurations, and the results are similar – it’s not a driver thing, so I am thinking it’s gotta be my code. I suspect I am missing some initialization twiddling, but I can’t figure out what. Any insight would be extremely appreciated, as I am getting ready to punt OpenGL and try something less open source-ish.
Thanks,
-Mike
/**
- \brief Draws a blue circle of NumDiv angular segments
with NumRings radius segments. The shade of
blue gets more intense as you step out in radius.
*/
void
MapView: rawColorWheel(int NumDiv, int NumRings)
{
int index, index1;
float Radius = 1.0;
float x;
float y;
float ColorFactor = 1.0/((float)NumRings);// Draw inner ring
glBegin(GL_TRIANGLE_FAN);
glColor3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glColor3f(0.0f,0.0f,ColorFactor);
for (index = 0; index <= NumDiv; index++)
{
x = sin(2.0M_PI(float)index/((float)NumDiv));
y = cos(2.0M_PI(float)index/((float)NumDiv));
glVertex3f(x,y,0.0);
}
glEnd();// Draw the outer range segments as a series of cirular strips
for (index1 = 1; index1 < NumRings; index1++)
{
glBegin(GL_TRIANGLE_STRIP);
for (index = 0; index <= NumDiv; index++)
{
// handle wrap-around to make exactly match first points
if (index == NumDiv)
{
x = sin(2.0M_PI0.0/((float)NumDiv));
y = cos(2.0M_PI0.0/((float)NumDiv));
}
else
{
x = sin(2.0M_PI(float)index/((float)NumDiv));
y = cos(2.0M_PI(float)index/((float)NumDiv));
}
glColor3f(0.0f,0.0f,(float)(index1+1)ColorFactor);
glVertex3f((Radius+1.0)x,(Radius+1.0)y,0.0);
glColor3f(0.0f,0.0f,(float)index1ColorFactor);
glVertex3f(Radiusx,Radiusy,0.0);
}
glEnd();
Radius += 1.0;
}}
/**
- \brief Handle resize event
/
void
MapView::resizeEvent( QResizeEvent e)
{
glViewport(0, mcLastPixmap.height()-e->size().height(), (GLsizei) e->size().width(), (GLsizei) e->size().height());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// msMMinX, etc. are the desired “zoom” coordinates that I want to see
// works great with msMMinX, etc. fairly large, works poorly with
// values “small” (covering maybe 100 triangles or less) from above
// +/- 100 z is intended for future clipping of “overlay” data
glOrtho(msMMinX, msMMaxX, msMMinY, msMMaxY, -100.0, 100.0);
glMatrixMode(GL_MODELVIEW);
}/**
- Draw the map. This method is always called with the
- MODELVIEW_MATRIX selected.
*/
void MapView::drawMap()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
DrawColorWheel(64, 20);
glFinish();
glFlush();
}