GL_SELECT
ピッキングに使っています。すべてが正常に機能し、オブジェクトが正しく選択されます。ただし、選択したオブジェクトの z 座標には問題があります。何らかの理由で、それらはすべて に等しくなり-2147483648
ます。したがって、いくつかのオブジェクトが選択された場合、どれがより近いかを判断できません。
私は次のコードを持っています:
private int[] pickBuffer = new int[PICK_BUFFER_SIZE];
private IntBuffer pickGlBuffer = java.nio.IntBuffer.wrap(pickBuffer);
public void init(GLAutoDrawable drawable) {
glu = new GLU();
GL2 g2 = drawable.getGL().getGL2();
{ // options
g2.glEnable(GL.GL_DEPTH_TEST);
g2.glDepthFunc(GL.GL_LEQUAL);
g2.glShadeModel(GLLightingFunc.GL_SMOOTH);
g2.glHint(GL2ES1.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
g2.glClearColor(0f, 0f, 0f, 1f);
}
}
public void display(final GLAutoDrawable drwabale) {
GL2 g2 = drwabale.getGL().getGL2();
g2.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
Arrays.fill(pickBuffer, 0); // just for debug
g2.glSelectBuffer(PICK_BUFFER_SIZE, pickGlBuffer);
{ // selection
g2.glRenderMode(GL2.GL_SELECT);
g2.glInitNames();
g2.glPushName(-1);
setProjections(g2, GL2.GL_SELECT);
doDraw(g2);
}
int hits = g2.glRenderMode(GL2.GL_RENDER);
processPicking(hits, pickBuffer);
{ // actual drawing
setProjections(g2, GL2.GL_RENDER);
doDraw(g2);
}
}
private void setProjections(final GL2 g2, final int renderMode) {
g2.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
g2.glLoadIdentity();
if (renderMode == GL2.GL_SELECT) {
glu.gluPickMatrix((double) currentMouseX, (double) (viewPort[3] - currentMouseY), 3, 3, viewPort, 0);
}
double width = glCanvas.getWidth(), height = glCanvas.getHeight();
glu.gluPerspective(45, width / height, 1, 1000);
{
double yawRad = getYawAngle() / 180 * Math.PI;
double pitchRad = getPitchAngle() / 180 * Math.PI;
double vd = getViewerDistance();
double vx = Math.sin(pitchRad) * Math.sin(yawRad) * vd;
double vy = Math.cos(pitchRad) * vd;
double vz = Math.sin(pitchRad) * Math.cos(yawRad) * vd;
glu.gluLookAt(
vx, vy, vz,
0, 0, 0,
0, 1, 0);
}
g2.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
g2.glLoadIdentity();
}
private void doDraw(final GL2 g2) {
if (isAxesPainted()) {
drawAxes(g2);
}
drawPlanes(g2);
}
private void drawPlanes(final GL2 g2) {
g2.glColor3d(1, 1, 1);
g2.glPolygonMode(GL.GL_FRONT_AND_BACK, GL2GL3.GL_LINE);
{ // xy plane
g2.glLoadName(XY_PLANE_NAME);
g2.glBegin(GL2.GL_QUADS);
g2.glTexCoord2d(0, 0);
g2.glVertex3d(-xBound / 2, -yBound / 2, xyPosition);
g2.glTexCoord2d(1, 0);
g2.glVertex3d(xBound / 2, -yBound / 2, xyPosition);
g2.glTexCoord2d(1, 1);
g2.glVertex3d(xBound / 2, yBound / 2, xyPosition);
g2.glTexCoord2d(0, 1);
g2.glVertex3d(-xBound / 2, yBound / 2, xyPosition);
g2.glEnd();
}
{ // xz plane
g2.glLoadName(XZ_PLANE_NAME);
g2.glBegin(GL2.GL_QUADS);
g2.glTexCoord2d(0, 0);
g2.glVertex3d(-xBound / 2, xzPosition, -zBound / 2);
g2.glTexCoord2d(1, 0);
g2.glVertex3d(xBound / 2, xzPosition, -zBound / 2);
g2.glTexCoord2d(1, 1);
g2.glVertex3d(xBound / 2, xzPosition, zBound / 2);
g2.glTexCoord2d(0, 1);
g2.glVertex3d(-xBound / 2, xzPosition, yBound / 2);
g2.glEnd();
}
{ // yz plane
g2.glLoadName(YZ_PLANE_NAME);
g2.glBegin(GL2.GL_QUADS);
g2.glTexCoord2d(0, 0);
g2.glVertex3d(yzPosition, yBound / 2, zBound / 2);
g2.glTexCoord2d(1, 0);
g2.glVertex3d(yzPosition, yBound / 2, -zBound / 2);
g2.glTexCoord2d(1, 1);
g2.glVertex3d(yzPosition, -yBound / 2, -zBound / 2);
g2.glTexCoord2d(0, 1);
g2.glVertex3d(yzPosition, -yBound / 2, zBound / 2);
g2.glEnd();
}
}
UPD
問題はアプリケーションロジックではなく、このコードを別のコンピューター (win 7 x64) で実行しようとしたため、jogl または opengl ドライバーにあるようで、すべて正常に動作しています。適切な z 座標が選択バッファーに格納されており、それらを並べ替えて最も近いオブジェクトを取得できます。
現在、問題は win xp x86 で再現可能です。