Screen -> World: Works only with orthographic

I’m writing a routine to intersect the line from eye-point to the point on the screen with a plane (a plane is given in the world’s coordinate system).

Here’s the pseudocode:


Vector3d
intersect(windowX, windowY, plane) {
    Line line = new Line(
                    project(modelview, windowX, windowY, 3),
                    project(modelview, windowX, windowY, 10)
                );
    return line.intersect(plane);
}

The code that implements this pseudocode works correctly with orthographic projection, but returns incorrect results with perspective projection.

Here’s the pseudocode of project routine:


Vector3d
project(modelview, winX, winY, winZ) {
    double[] pos = new double[3];   
    gluUnProject(winX, viewport[3] - winY, winZ, modelview,
        projection, viewport, pos);
    return pos;
}

Please, can anyone explain what I am doing wrong?

The second parameter for gluUnProject should be viewport[3] - winY - 1, but this is just a one pixel distance error.

I notice that you pass only the modelview matrix for your project function. I think you don’t need to pass it because you can call getDoublev(GL_MODELVIEW_MATRIX,…) inside your function.

In my unProject function I do something like this


  GLdouble proj[16];
  GLdouble model[16]; 
  GLint view[4];
 
  glGetDoublev(GL_MODELVIEW_MATRIX,model);
  glGetDoublev(GL_PROJECTION_MATRIX,proj);
  glGetIntegerv(GL_VIEWPORT,view);
  y = height - 1 - y;
  gluUnProject((GLdouble)x,(GLdouble)y,z,model,proj,view,
	       &objx,&objy,&objz);

  1. Are you sure about this -1 thing? I changed it, but it didn’t fix the problem
  2. The current modelview matrix is simply not the one I need (there were some pushs and pops during rendering)
  3. Everything works fine without perspective, it gets worse only when I turn on the perspective…
  1. You need to subtract -1 because if the height of your viewport is 480, the range of y is [0 479].

  2. I think you need the most recent modelview and projection matrix when you unproject a screen coord to object coord.

  3. My guess is when you are in orthographic projection, if you get the modelview matrix and then you translate forward or backward, the result is correct because all line are parallel. But this is not the case in perspective view, so the first point of the line is very important.

Edit:

project(modelview, windowX, windowY, 3),
project(modelview, windowX, windowY, 10)

vs

project(modelview, windowX, windowY, 0),
project(modelview, windowX, windowY, 10)

will have probably the same result in orthographic view,
but not the same in perspective view.

trinitrotoluene

  1. Yes, you are right :slight_smile: Thanks
  2. No, you need to send the modelview matrix with which the object was drawn

Yes, the problem is actually that
Line (
project(modelview, windowX, windowY, 0),
project(modelview, windowX, windowY, 10)
)
and
Line (
project(modelview, windowX, windowY, 3),
project(modelview, windowX, windowY, 10)
)
are different :frowning:

Does anyone by any chance has an idea on how to solve this problem?

project(modelview, windowX, windowY, 3),
project(modelview, windowX, windowY, 10)