PDA

View Full Version : Error changing projection matrix?



Exoide
10-15-2009, 12:47 PM
Hi,

I'm trying to draw a rectangle in a perspective projection to show the area selected by the user when he wants to select the objects inside the rectangle drawn but the rectangle is not shown.

Here's the code.


public void DrawRectangleSelection(Point point1, Point point2)
{
// Store the projection matrix
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glPushMatrix();
Gl.glLoadIdentity();
// Change the projection to orthographic
Gl.glOrtho(-20, 20, -20, 20, -50, 50);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glPushMatrix();
Gl.glLoadIdentity();
// Draw the rectangle
Vector3d wp1 = UnProject(point1.X, point1.Y, 0);
Vector3d wp2 = UnProject(point2.X, point2.Y, 0);

Gl.glVertex3d(wp1.X, wp1.Y, 0);
Gl.glVertex3d(wp1.X, wp2.Y, 0);
Gl.glVertex3d(wp2.X, wp2.Y, 0);
Gl.glVertex3d(wp2.X, wp1.Y, 0);
// Restore the Projection matrix
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glPopMatrix();
// Restore the ModelView matrix
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glPopMatrix();
}

There's some extra code before the method is called that calls the glBegin(), and so on.

The custom method UnProject() works well.

Do I've some error in my code? I suspect I've an error changing the projection matrix.

Thanks

PD: I'm using TAO Framework.

vivek vyas
10-15-2009, 01:06 PM
can you use
gluOrtho2D
i m not sure but -50, 50);
may cause some problem
may be use gluOrtho2D
and read gluOrtho2D spec
read
if u don't know gluOrtho2D.

todayman
10-15-2009, 05:17 PM
You need Gl.glBegin(GL_QUADS), or some other primitive type before you call glVertex*, and a glEnd() afterwards.

vivek vyas
10-16-2009, 12:44 AM
damn,
i haven't notice

Exoide
10-16-2009, 05:33 AM
Hi Todayman,

In my post I wrote:



There's some extra code before the method is called that calls the glBegin(), and so on.

todayman
10-16-2009, 07:41 AM
Didn't notic that, but...

The glBegin() and end must be immediately around the glVertex commands. Matrix manipulation commands are not allowed to be between the glBegin and glEnd. When you call these function, OpenGL is probably getting an error and ignoring the primitives defined by that begin/end block.

Only normal, texture coordinate, color, attribute, and fog settings (which are per-vertex) can be set within the block.

Exoide
10-16-2009, 08:27 AM
Hi Todayman!

That's exactly what's happening glBegin() must be immediately around the glVertex().

Now it works!

Thank you guys :)