0

我正在GL_SELECT使用 JOGL Java 库在 OpenGL 中实现鼠标选择的方法。我知道这种方法已被弃用,但这是一个简单的学校作业,应该这样做。

但是我遇到了一些麻烦:即使某些东西以GL_SELECT模式呈现,也glRenderMode(GL_RENDER)返回零命中。问题是确定性的,但我没有看到一种模式;例如,如果我在中心有一个球体,如果我点击它的上部,它就可以工作,但不能点击它的下部。对于一个立方体,它只不适用于一个特定的面。对于矩形,它可以正常工作。

我已经测试了注释掉glRenderMode(GL_SELECT)以检查是否确实正在渲染某些东西,是的,我可以看到形状,但即便如此glRenderMode(GL_RENDER)给了我零。

编辑:我还测试了删除对gluPickMatrix()和的调用glRenderMode(GL_SELECT),这给了我与正常(非拾取)渲染完全相同的情况,因此我认为投影和模型视图矩阵设置正确。

所以,我不认为我在选择模式下渲染不正确。会发生什么?

编辑:也许这可能是一个硬件问题,因为该方法已被弃用。那可能吗?

提前致谢。

// Get required information
point.y = getHeight() - point.y;
gl.glGetIntegerv(GL2.GL_VIEWPORT, view, 0);

// Setup OpenGL for selection
gl.glSelectBuffer(64, buffer);
gl.glRenderMode(GL2.GL_SELECT);
gl.glInitNames();

// Setup projection matrix
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glPushMatrix();
gl.glLoadIdentity();

Util.glu.gluPickMatrix( point.x, point.y, 5.0, 5.0, view, 0 );
Util.glu.gluPerspective(camera.getFieldOfView(), getWidth() * 1.0 / getHeight(),
                    camera.getCloseDistance(), camera.getFarDistance() );

// Setup model view matrix for rendering
gl.glMatrixMode(GL2.GL_MODELVIEW);
camera.setView(gl); // Set to model view and use glLookAt
gl.glClear( GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT );

// Render objects
for(int i = 0; i < shapeList.size(); i++) {
    gl.glPushName(i);
    // Execute transformations for translation/rotation/scale and render shape
    shapeList.get(i).display(gl, false);
    gl.glPopName();
}
// Process hits
hits = gl.glRenderMode(GL2.GL_RENDER);
System.out.println("Hits = " + hits);
// ... Process hits here ...
// Reset matrixes
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glPopMatrix();
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();

camera.setView功能:

public void setView( GL2 gl ) {
    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
    Util.glu.gluLookAt( eye[Axis.X], eye[Axis.Y], eye[Axis.Z],
               target[Axis.X], target[Axis.Y], target[Axis.Z],
               up[Axis.X], up[Axis.Y], up[Axis.Z] );
}
4

0 回答 0