Marcel S.
- Forum-Beiträge: 120
23.02.2012, 19:17:24 via Website
23.02.2012 19:17:24 via Website
Hallo zusammen...
Ich habe hier ein kleines Problem, und hoffe das mir jemand von euch einen kleinen Denkanstoß geben kann
Also ich versuche hier per ColorPickerMethode die angeklickten Objekte in meiner Szene zu Identifizieren.
soweit Funktioniert das jetzt auch prima. Allerdings spuckt mir glReadPixels() nur die richtigen Werte aus
wenn die zu analysierende Farbe entweder voll oder gar nicht gezeichnet wird.
zur Veranschaulichung:
solche Farben, also Farben deren komponenten entweder 255 oder 0 sind, werden gepickt und korrekt zurückgegeben... die Werte entsprechen RGBA
bei solchen werten erhalte ich nicht nur die Falsche Farbe zurück.. sondern erhalte bei mehrfachem auswerten der selben Farbe auf dem Bildschirm auch noch unterschieliche Ergebnisse.
Jetzt dachte ich bereits an einen Umrechenfehler zwischen float und integer konnte allerdings keinen ausmachen und die unterschiedlichen Ergebnisse bei einem Klick auf einen gleichfarbigen pixel würde das auch nicht erklären.
Hier kurz die Methode mit der ich den Pixel auslese:
[code]
public ByteBuffer buffer = ByteBuffer.allocateDirect(4);
gl.glReadPixels(this.touchPoint.x, this.touchPoint.y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE,buffer);
for(int b = 0; b < 4; b+=1){
this.pickcolor[b] = (int)buffer.get(b)& 0xff; if (pickcolor[b]<0) pickcolor[b]+=256;
}
[/code]
Die X und Y Koordinaten des Pixels erhalte ich durch onTouch und die Koordinaten wurden bereits an das Ogl Koordinatensystem angepasst.
Ich hoffe mir kann jemand weiter helfen. Ich kann mir eigentlich nur Vorstellen das ich die Werte schon Falsch aus dem ByteBuffer hole allerdings
weis ich nicht wie ich das anders anstellen könnte.
Ausgewertet wird das ganze in der onDrawFrame(GL10 gl)
1. Zeichnen der Objekte mit einmaliger Farbe
2. Auswerten des ge-pickten Pixels
3. Echte Szene Zeichnen
Vielen dank für eure Mühe...
Ich habe hier ein kleines Problem, und hoffe das mir jemand von euch einen kleinen Denkanstoß geben kann
Also ich versuche hier per ColorPickerMethode die angeklickten Objekte in meiner Szene zu Identifizieren.
soweit Funktioniert das jetzt auch prima. Allerdings spuckt mir glReadPixels() nur die richtigen Werte aus
wenn die zu analysierende Farbe entweder voll oder gar nicht gezeichnet wird.
zur Veranschaulichung:
solche Farben, also Farben deren komponenten entweder 255 oder 0 sind, werden gepickt und korrekt zurückgegeben... die Werte entsprechen RGBA
1float[]{0f,0f,1f,0f}
2float[]{0f,1f,1f,0f}
3float[]{1f,1f,1f,0f}
2float[]{0f,1f,1f,0f}
3float[]{1f,1f,1f,0f}
bei solchen werten erhalte ich nicht nur die Falsche Farbe zurück.. sondern erhalte bei mehrfachem auswerten der selben Farbe auf dem Bildschirm auch noch unterschieliche Ergebnisse.
1float[]{0.1f,0.1f,0.1f,0f}
2float[]{0.2f,0.2f,0.2f,0f}
3float[]{0.3f,0.3f,0.3f,0f}
2float[]{0.2f,0.2f,0.2f,0f}
3float[]{0.3f,0.3f,0.3f,0f}
Jetzt dachte ich bereits an einen Umrechenfehler zwischen float und integer konnte allerdings keinen ausmachen und die unterschiedlichen Ergebnisse bei einem Klick auf einen gleichfarbigen pixel würde das auch nicht erklären.
Hier kurz die Methode mit der ich den Pixel auslese:
[code]
public ByteBuffer buffer = ByteBuffer.allocateDirect(4);
gl.glReadPixels(this.touchPoint.x, this.touchPoint.y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE,buffer);
for(int b = 0; b < 4; b+=1){
this.pickcolor[b] = (int)buffer.get(b)& 0xff; if (pickcolor[b]<0) pickcolor[b]+=256;
}
[/code]
Die X und Y Koordinaten des Pixels erhalte ich durch onTouch und die Koordinaten wurden bereits an das Ogl Koordinatensystem angepasst.
Ich hoffe mir kann jemand weiter helfen. Ich kann mir eigentlich nur Vorstellen das ich die Werte schon Falsch aus dem ByteBuffer hole allerdings
weis ich nicht wie ich das anders anstellen könnte.
Ausgewertet wird das ganze in der onDrawFrame(GL10 gl)
1. Zeichnen der Objekte mit einmaliger Farbe
2. Auswerten des ge-pickten Pixels
3. Echte Szene Zeichnen
Vielen dank für eure Mühe...
— geändert am 23.02.2012, 20:32:11
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.