我使用GL_SELECT
方法在OpenGL中使用JOGL Java Library实现鼠标选择。
我知道这个方法已被弃用等等,但这是一个简单的学校作业,应该这样做。
但是我遇到了一些问题:即使在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] );
}