我正在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] );
}