Ich versuche mit Color Picking herauszufinden welches Objekt man angeklickt hat. Jedoch haben diese Objekte Texturen (die lade ich mit Slick). Ich habe bereits mit "glDisable(GL_TEXTURE_2D);" versucht die Texturen zu deaktivieren jedoch sieht es dann genau gleich aus als hätte ich die Zeile nicht geschrieben. Die Texturen werden bei glNewList(int) mit den Objekten mitgerendert. Hier wäre der Code für das Color Picking:
Ich verwende get(x,y) immer mit get(Display.getWidth()/2,Display.getHeight()/2). Dies sagt mir dann welches Objekt ich angeklickt habe. Die "*20" bei der Farbenauswahl ist nur drin, dass man beim "schauen" die Farbzuteilung besser erkennt.
Java:
private static int get(int x, int y) {
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE);
glDisable(GL_TEXTURE_2D);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
ObjectControl.getCamera().applyTranslations();
byte blue,green,red;
for(int i = 0; i < ObjectControl.getModels().size(); i++) {
TextureImpl.bindNone();
Model m = (Model) ObjectControl.getModels().toArray()[i];
blue = (byte) ((i+1)*20%256);
green = min((int)((float)(i+1)*20/256), 255);
red = min((int)((float)(i+1)*20/256/256), 255);
glColor3ub(red, green, blue);
glPushMatrix();
glTranslated(m.getX(),m.getY(),m.getZ());
glScalef(m.getScaleX(),m.getScaleY(),m.getScaleZ());
glRotatef(m.getAngle(), m.getRotateX(), m.getRotateY(), m.getRotateZ());
glCallList(m.getID());
glPopMatrix();
System.out.println(blue+" "+green+" "+red);
}
glEnable(GL_TEXTURE_2D);
glColor3f(1,1,1);
ByteBuffer b = ByteBuffer.allocateDirect(3);
glReadPixels((int)x, (int)y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, b);
if(Mouse.isButtonDown(2)) {
Display.update();
// Hier kann man sehen wie das Color Picking die Farben zeichnet.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
byte[] pixelColors = new byte[b.remaining()];
b.get(pixelColors);
return (pixelColors[0]*256*256 + pixelColors[1]*256 + pixelColors[2])+1;
}
private static byte min(int i, int j) {
if(i>=j)
return (byte) j;
return (byte) i;
}
Ich verwende get(x,y) immer mit get(Display.getWidth()/2,Display.getHeight()/2). Dies sagt mir dann welches Objekt ich angeklickt habe. Die "*20" bei der Farbenauswahl ist nur drin, dass man beim "schauen" die Farbzuteilung besser erkennt.
Zuletzt bearbeitet: