Hi Community,
ich habe mometan das Problem, dass ich mit glut generierten Text nicht gleichzeitig mit einem anderen Objekt aus Vertices (inkl. Textur) auf einer Szene darstellen kann.
Wie bereits aus dem Titel erkennbar wird benutze ich die JOGL wrapper library. Ich habe seit einer Weile mein Projekt nicht mehr angefasst, da ich im letzten Jahr leider wenig Zeit dafür hatte, daher bin ich mir z.B. bei der Benutzung der Methoden glPushMatrix() und glPopMatrix() an bestimmten Stellen nicht mehr sicher.
Sobald ich die Draw Methode nicht mehr aufrufe, wird der Text ordnungsgemäß angezeigt. Analog dazu: Wenn ich die Ausgabe das Textes auskommentiere (Aufrufe von glutBitmapString etc), dann wird das Objekt gezeichnet.
Wenn ich es so lasse wie oben zu sehen ist, dann wird ebenfalls nur das Objekt angezeigt.
Display Methode:
Draw Methode:
Wie schaffe ich es nun, dass beides gleichzeitig angezeigt wird?
Vielen Dank im Voraus
Gruß
MrCastle
ich habe mometan das Problem, dass ich mit glut generierten Text nicht gleichzeitig mit einem anderen Objekt aus Vertices (inkl. Textur) auf einer Szene darstellen kann.
Wie bereits aus dem Titel erkennbar wird benutze ich die JOGL wrapper library. Ich habe seit einer Weile mein Projekt nicht mehr angefasst, da ich im letzten Jahr leider wenig Zeit dafür hatte, daher bin ich mir z.B. bei der Benutzung der Methoden glPushMatrix() und glPopMatrix() an bestimmten Stellen nicht mehr sicher.
Sobald ich die Draw Methode nicht mehr aufrufe, wird der Text ordnungsgemäß angezeigt. Analog dazu: Wenn ich die Ausgabe das Textes auskommentiere (Aufrufe von glutBitmapString etc), dann wird das Objekt gezeichnet.
Wenn ich es so lasse wie oben zu sehen ist, dann wird ebenfalls nur das Objekt angezeigt.
Display Methode:
Code:
public void display(GLAutoDrawable gLDrawable) {
// GL-Objekt von der Zeichenfläche holen
final GL gl = gLDrawable.getGL();
// Zeichenfläche löschen
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
// glu.gluOrtho2D(-1.0, 1.0, -1.0 * (float) height / (float) width, 1.0 * (float) height / (float) width);
glu.gluOrtho2D(0, 0, width, height);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
// Alphatest zur Erkennung der Transparenz anhand der Textur
gl.glEnable(GL.GL_ALPHA_TEST);
gl.glAlphaFunc(GL.GL_GREATER, 0.1f);
// Blending zur Behebung der weißen Ränder durch Alphatest
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
// Schiff zeichnen
testShip.draw(gl);
// Text zeichnen
DecimalFormat f = new DecimalFormat("#0.00");
// Text zeichnen
gl.glRasterPos2f(-1.0f, 0.94f);
glut.glutBitmapString(GLUT.BITMAP_TIMES_ROMAN_10, "X: " + f.format(testShip.getPosition().x));
gl.glRasterPos2f(-1.0f, 0.9f);
glut.glutBitmapString(GLUT.BITMAP_TIMES_ROMAN_10, "Y: " + f.format(testShip.getPosition().y));
gl.glRasterPos2f(-1.0f, 0.86f);
glut.glutBitmapString(GLUT.BITMAP_TIMES_ROMAN_10, "Z: " + f.format(testShip.getPosition().z));
gl.glRasterPos2f(-1.0f, 0.82f);
glut.glutBitmapString(GLUT.BITMAP_TIMES_ROMAN_10, "Rotation: " + f.format(testShip.getRotation()));
gl.glFlush();
}
Draw Methode:
Code:
public void draw(GL gl){
// Nur zeichnen wenn erlaubt
if(allowDrawing){
gl.glPushMatrix();
// Das Objekt auf seine aktuelle Position setzen.
gl.glTranslated(posVect.x, posVect.y, posVect.z);
// Das Objekt drehen, da bisher nur Vektor gedreht wurde
gl.glRotated(rotation, 0, 0, 1);
// Texturbind
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBindTexture(GL.GL_TEXTURE_2D, tex.getTexture().texID[0]);
// Objekt zeichnen
gl.glBegin(GL.GL_QUADS);
gl.glTexCoord2d(0,0); gl.glVertex3d(-width/2,-height/2, 0);
gl.glTexCoord2d(1,0); gl.glVertex3d(+width/2,-height/2, 0);
gl.glTexCoord2d(1,1); gl.glVertex3d(+width/2,+height/2, 0);
gl.glTexCoord2d(0,1); gl.glVertex3d(-width/2,+height/2, 0);
gl.glEnd();
gl.glPopMatrix();
}
}
Wie schaffe ich es nun, dass beides gleichzeitig angezeigt wird?
Vielen Dank im Voraus
Gruß
MrCastle