JOGL und TextRenderer

Status
Nicht offen für weitere Antworten.

Evolver

Bekanntes Mitglied
Ich habe ein kleines Problem mit der (2D) Textdarstellung bei Verwendung des com.sun.opengl.util.j2d.TextRenderer und JOGL. Und zwar wird der Text nicht da dargestellt, wo ich das möchte. Ich benutze JOGL nur zweidimensional, also initialisiere ich die Ansicht wie folgt:
Java:
gl.glMatrixMode( GL.GL_PROJECTION );
gl.glLoadIdentity();
gl.glViewport( 0, 0, width, height );
gl.glOrtho( 0, width, height, 0, 0, 128 );
Dadurch habe ich eine normale Zeichenfläche wie in Java2D. Wenn ich jetzt aber den TextRenderer verwende, hat der seinen Koordinatenursprung links unten.
Java:
textRenderer = new TextRenderer( new Font( "SansSerif", Font.PLAIN, 11 ) );
//...
textRenderer.beginRendering( drawable.getWidth(), drawable.getHeight() );
textRenderer.setColor( 0.8f, 0.85f, 0.775f, 1.0f );
textRenderer.draw( "Blabla", 20, 20 );
textRenderer.endRendering();
Wie bekomme ich ihn dazu, das gleiche Koordinatensystem zu verwenden, das ich sonst auch zum Zeichenen nutze?
 

Evolver

Bekanntes Mitglied
Hat denn niemand Erfahrungen mit dem TextRenderer? Was nutzt ihr denn alternativ zur 2D-Textdarstellung unter JOGL?
 
S

Spacerat

Gast
Mit dem TextRenderer nicht. Ich verwende JGL (eigene Entwicklung für 2D-/3D-Fonts). Was aber bei Fonts stets auffält, ist, dass sie überall ihren Ursprung "links unten" haben. Wenn ich bei meiner Entwicklung einen Text an eine bestimmte Stelle haben will, muss ich auch dort stets 1x Fonthöhe zur Y-Position hinzu zählen.
 

Marco13

Top Contributor
Hatte da neulich schonmal kurz in die API-Doku geschaut, und jetzt nochmal... ich habe TextRenderer noch nicht "richtig" verwendet, und um's zu testen, müßte ich mir erstmal ein KSKB bauen (
zaunpfahl.gif
) aber mein erster Ansatz wäre, ein TextRenderer.RenderDelegate im Konstruktor zu übergeben, das von TextRenderer.DefaultRenderDelegate erbt, und die "draw"-Methode passend überschreibt, d.h. im übergebenen Graphics praktisch vertikal spiegelt, verschiebt, und nochmal spiegelt... damit müßte das IMHO hinzukriegen sein...
 

Evolver

Bekanntes Mitglied
@Marco13
Ich habe mal ein Testprogramm um das Problem herum erstellt.
Java:
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.font.GlyphVector;

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;

import com.sun.opengl.util.j2d.TextRenderer;



public class FirstTest implements GLEventListener
{
    public static void main( String[] args )
    {
        new FirstTest();
    }    
    
    private static final int WIDTH = 640;
    private static final int HEIGHT = 480;
    
    private Frame frame;
    private GLCanvas canvas;
    private TextRenderer textRenderer;
    
    
    public FirstTest()
    {
        canvas = new GLCanvas();
        canvas.addGLEventListener( this );
        canvas.setSize( WIDTH, HEIGHT );

    	frame = new Frame( "Simple JOGL Application" );
        frame.add( canvas );
        frame.pack();
        frame.setResizable( false );
        frame.setLocationRelativeTo( null );

        frame.addWindowListener( new WindowAdapter()
	        {
	            @Override
	            public void windowClosing( WindowEvent e )
	            {
	                System.exit( 0 );
	            }
	        });
        
        frame.setVisible( true );
    }

    
    public void init( GLAutoDrawable drawable )
    {
        GL gl = drawable.getGL();

        gl.setSwapInterval( 1 );
        gl.glClearColor( 1.0f, 1.0f, 0.9f, 0.0f );
        gl.glShadeModel( GL.GL_SMOOTH );

        textRenderer = new TextRenderer( new Font( "SansSerif", Font.PLAIN, 30 ),
        								 false, false, new MyRenderDelegate() );
    }

    
    public void reshape( GLAutoDrawable drawable, int x, int y, int width, int height )
    {
        GL gl = drawable.getGL();
        
        gl.glMatrixMode( GL.GL_PROJECTION );
        gl.glLoadIdentity();
        gl.glViewport( 0, 0, WIDTH, HEIGHT );
        gl.glOrtho( 0, WIDTH, HEIGHT, 0, 0, 128 );
    }

    
    public void display( GLAutoDrawable drawable )
    {
        GL gl = drawable.getGL();

        // Clear the drawing area
        gl.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT );
        
        textRenderer.beginRendering( drawable.getWidth(), drawable.getHeight() );
        textRenderer.setColor( 0.4f, 0.2f, 0.6f, 0.8f );
        textRenderer.draw( "Blabla", 220, 20 );
        textRenderer.endRendering();
        
        gl.glBegin( GL.GL_QUADS );
          gl.glColor3f( 0.5f, 1.0f, 0.5f );
          gl.glVertex2i( 10, 10 );
          gl.glColor3f( 0.5f, 0.5f, 1.0f );
          gl.glVertex2i( 110, 10 );
          gl.glColor3f( 1.0f, 0.5f, 0.5f );
          gl.glVertex2i( 110, 110 );
          gl.glColor3f( 0.5f, 0.5f, 1.0f );
          gl.glVertex2i( 10, 110 );
        gl.glEnd();

        gl.glFlush();
    }

    
    public void displayChanged( GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged )
    {
    }
}


class MyRenderDelegate extends TextRenderer.DefaultRenderDelegate
{
	@Override
	public void draw( Graphics2D g2d, String str, int x, int y )
	{
		super.draw( g2d, str, x, y );
	}
	

	@Override
	public void drawGlyphVector( Graphics2D g2d, GlyphVector vector, int x, int y )
	{
		super.drawGlyphVector( g2d, vector, x, y );
	}
}

Ich habe jetzt schon mal ein bisschen im eigenen RenderDelegate rumgespielt, aber die Ergebnisse waren eher ... naja, nicht der Rede wert.
 

Marco13

Top Contributor
Oh ja, hab's jetzt mal getestet. Da hatte ich beim TextRenderer und dem RenderDelegate einiges mißverstanden (bzw. einiges ging aus der API-Doku nicht eindeutig hervor), aber nach einem Blick in den Quellcode ist einiges klarer. Das RenderDelegate ist nicht dafür da, wofür ich gedacht hatte - das wird wirklich nur verwendet, um einzelne Buchstaben zu zeichnen und in den Cache zu legen (die drawGlyph-Methode wird bei "Blabla" z.B. nur 4 mal aufgerufen). Das eigentliche Rendern liegt im Zusammenspiel mit dem TextRenderer und seiner privaten "Glyph"-Klasse - da kommt man wohl erstmal nicht ran :(

Die einzige Möglichkeit, die ich jetzt sehe, ist, das Koordinatensystem per Hand umzurechnen, also nicht
textRenderer.draw( "Blabla", 220, 40 );
sondern
textRenderer.draw( "Blabla", 220, drawable.getHeight()-40 );
zu schreiben...

Vielleicht hat noch irgendjemand einen anderen Ansatz, aber ... ich wüßte da jetzt nichts mehr - der TextRenderer ist erschreckend einfach und bequem zu verwenden, aber die einfache API erzwingt ja schon geradezu, dass man die "Innereien" nicht so leicht beeinflussen kann.
 

Evolver

Bekanntes Mitglied
Ja, ich habe mir jetzt einen abgeleiteten TextRenderer geschireben, der die Koordinaten immer enstprechend umrechnet. Dem gebe ich einfach immer die gleichen Koordinaten (left, right, bottom, top) wie dem glOrtho-Aufruf. Das müsste eigentlich passen.

Java:
public class OrthoTextRenderer extends TextRenderer
{
	private int left;
	private int right;
	private int top;
	private int bottom;
	
	
	public OrthoTextRenderer( Font font )
	{
		super( font );
		setOrthoCoordinates( 0, 0, 0, 0 );
	}
	
	// Anwendungsbeispiel:
	// gl.glOrtho( 0, WIDTH, HEIGHT, 0, 0, 128 );
	// textRenderer.setOrthoCoordinates( 0, WIDTH, HEIGHT, 0 );
	public void setOrthoCoordinates( int left, int right, int bottom, int top )
	{
		this.left = left;
		this.right = right;
		this.bottom = bottom;
		this.top = top;
	}
	
	
	private int getOrthoX( int x )
	{
		if( left<=right )
			return x - left;
		else
			return left - x + right;
	}
	
	
	private int getOrthoY( int y )
	{
		if( bottom<=top )
			return y - bottom;
		else
			return bottom - y + top;
	}

	
	@Override
	public void draw( String text, int x, int y )
	{
		super.draw( text, getOrthoX( x ), getOrthoY( y ) );
	}

	
	@Override
	public void draw( CharSequence text, int x, int y )
	{
		super.draw( text, getOrthoX( x ), getOrthoY( y ) );
	}
}
 

XyMorgan

Aktives Mitglied
Hi,

die falsche Positionierung des Textes ensteht dadurch, dass der Textrenderer ein
anderes Koordinatensystem verwendet. Der TextRenderer rendert den erzeugten Text
über den TextureRenderer, der wird indirekt über beginnRendering mit Breite und Höhe
versorgt.

Du benutzt bei Deinem Ortho-Koordinatensystem

0,0 .. Breite,0
. .
. .
0,Höhe .. Breite,Höhe

Der TextureRenderer benutzt aber das bei OpenGL eher übliche Koordinatensystem

0,Höhe .. Breite,Höhe
. .
. .
0,0 .. Breite,0

Daher ist der 0,0 Bezugspunkt verschoben, bzw. liegt beim TextureRenderer in der linken, unteren Bildschirmecke,
bei Dir in der linken, oberen Bildschirmecke.

Dein Ansatz ist soweit daher also nutzbar, weil Du den Bezugspunkt ja nun umrechnest.
Grundlegend solltest Du aber überlegen, ob Du nicht den Bezugspunkt Deiner Anwendung auch nach unten, links verlegst. Diese Koordinatenprobleme wirst sonst evtl noch öfter bekommen.

bei Dir derzeit:
gl.glOrtho( 0, WIDTH, HEIGHT, 0, 0, 128 );

TextureRenderer benutzt:
gluOrtho2D(0, width, 0, height);

Ansonsten würde es reichen, wenn Du in der draw-Methode nur die Y-Position umrechnest. Dein Koordinatensystem hat 800 Höhe, und Du willst den Text bei 100 Höhe ausgeben, dann wäre es beim TextureRenderer-Koordinatensystem an der Position 700 also Höhe - YPosition.

//Martin.
 

Evolver

Bekanntes Mitglied
ICh glaube langsam, ich werde mich vom TextRenderer, der so schön einfach its, wieder abwenden. Denn wenn sobald ich z.B. mit glTranslate arbeite, ziehen die Änderungen beim Renderer wieder nichtmher und ich müsste es ebenfalls manuell nachziehen. Das ist zwar keine große Sache, aber langsam nervt das Ding. ;)

@XyMorgan
Über die Verlegung des Koordinatenursprungs habe ich schon nachgedacht, aber das entscheidet sich erst etwas päter.
 
S

Spacerat

Gast
Ich kann hier ja noch mal meine JOGL-Text-Unterschtützung verlinken. Das Paket im Forum ist zwar nicht mehr das jüngste aber immehin. Bei Bedarf kann ich Interessenten ja eine aktuellere Version zukommen lassen (z.B. per E-Mail). Also hier erstmal der Link.
3D-Fonts mit JOGL
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A [JOGL] TextRenderer malt Fläche hinter Buchstaben aus Spiele- und Multimedia-Programmierung 2
E JOGL kein zugriff auf manche methoden Spiele- und Multimedia-Programmierung 5
A Spielfelder erstellen mit Jogl Java durch ein Koordinaten Array Spiele- und Multimedia-Programmierung 1
M [JOGL] Maus über einem gezeichnetem Objekt abfragen? Spiele- und Multimedia-Programmierung 5
M [JOGL] eclipse export Runnable Jar - startet nicht Spiele- und Multimedia-Programmierung 3
D [JOGL] bibliothek aus jar laden Spiele- und Multimedia-Programmierung 3
A JOGL Shader Anfängerprobleme Spiele- und Multimedia-Programmierung 2
A JOGL FloatBuffer vs Buffers Spiele- und Multimedia-Programmierung 2
A JOGL glBindBuffer einmalig oder mehrmalig? Spiele- und Multimedia-Programmierung 3
A Aufbau einer JOGL Anwendung Spiele- und Multimedia-Programmierung 12
Z lwjgl oder jogl nutzen Spiele- und Multimedia-Programmierung 9
A Jogl-Projekt unter 32-Bit kompiliert und unter 64-Bit ausführen, geht das überhaubt ?? Spiele- und Multimedia-Programmierung 9
turing JOGL Cubes performant Spiele- und Multimedia-Programmierung 17
M JOGL Cubus mit Rand darstellen Spiele- und Multimedia-Programmierung 3
T JOGL 2D Objekte drehen rotate Spiele- und Multimedia-Programmierung 4
X JOGL - wie zum laufen bringen? Spiele- und Multimedia-Programmierung 2
M Schatten mit JOGL Spiele- und Multimedia-Programmierung 4
D [JOGL 2.0] Kleines Problem mit freier Flugsteuerung Spiele- und Multimedia-Programmierung 3
U [JOGL 1.1.1a]Kleines Problem mit Text Overlays: Spiele- und Multimedia-Programmierung 19
D [JOGL] Freibewegliche Lichtquelle im Raum Spiele- und Multimedia-Programmierung 4
H JOGL 2.0 jars fehlen Spiele- und Multimedia-Programmierung 8
R JOGL: glUniformLocation gibt immer -1 zurück Spiele- und Multimedia-Programmierung 4
BattleMaster246 Problem mit Jogl Spiele- und Multimedia-Programmierung 14
Mikescher [JOGL] Access restriction Spiele- und Multimedia-Programmierung 6
K jogl einbinden Spiele- und Multimedia-Programmierung 6
X JOGL - Textur auf Quad verzerrt Spiele- und Multimedia-Programmierung 2
X JOGL - 2D Sprite richtig platzieren Spiele- und Multimedia-Programmierung 4
T JOGL im OrthoMode und Texturen verfärben sich Spiele- und Multimedia-Programmierung 3
J JOGL konfigurieren / Windows 7 64-bit Spiele- und Multimedia-Programmierung 7
R JOGL polygon smooth Spiele- und Multimedia-Programmierung 20
J [JOGL] Kamera zentrieren über Achse Spiele- und Multimedia-Programmierung 4
BattleMaster246 Schussrichtung festlegen - JOGL Spiele- und Multimedia-Programmierung 8
BattleMaster246 Jogl Libs werden nicht geladen Spiele- und Multimedia-Programmierung 5
V Jogl: Objekt trotz Rotation immer in gleiche Richtung bewegen Spiele- und Multimedia-Programmierung 5
U [JOGL]Libs und Dlls mitliefern: Spiele- und Multimedia-Programmierung 9
S JOGL Perspektive Spiele- und Multimedia-Programmierung 2
R 2D Grafik JOGL Spiele- und Multimedia-Programmierung 18
D jogl downloaden ... wo? Spiele- und Multimedia-Programmierung 3
S JOGL 64 bit Spiele- und Multimedia-Programmierung 7
A jogl 2d performance Spiele- und Multimedia-Programmierung 20
J JOGL mit Netbeans Spiele- und Multimedia-Programmierung 3
S Jogl findet keine GLProfile ? Spiele- und Multimedia-Programmierung 6
C Frage zu Ray-Picking mit JOGL Spiele- und Multimedia-Programmierung 13
F Game mit LWJGL/JOGL in executable JAR packen, wie? Spiele- und Multimedia-Programmierung 6
D Jogl:Textur auf GLUquadric wird vertikal spiegelverkehrt dargestellt Spiele- und Multimedia-Programmierung 2
F LWJGL Smoother animieren lassen (wie bei JOGL = Animator) Spiele- und Multimedia-Programmierung 3
F JOGL 2.0 Bug? Spiele- und Multimedia-Programmierung 3
F Jogl oder Java3D ? Spiele- und Multimedia-Programmierung 20
N Ein paar fragen zu JOGL Spiele- und Multimedia-Programmierung 4
M JOGL - Mehr als nur ein Canvas - Texturpool Spiele- und Multimedia-Programmierung 7
S Jogl, no gluegen-rt :-( Spiele- und Multimedia-Programmierung 4
BattleMaster246 Pong - JOGL Spiele- und Multimedia-Programmierung 2
I JOGL: Problem mit Blending bei Billboards (Transparenz) Spiele- und Multimedia-Programmierung 2
1 JOGL: Fensterinhalt verschwindet sofort wieder Spiele- und Multimedia-Programmierung 3
jemandzehage JOGL 3D-Koordinaten des Klicks bestimmen Spiele- und Multimedia-Programmierung 2
P Erkennen auf welche Objekte gezeigt wird in JoGL Spiele- und Multimedia-Programmierung 6
E JOGL nur weißes Fenster Spiele- und Multimedia-Programmierung 2
Y 3D Koordinatensystem==> JOGL Spiele- und Multimedia-Programmierung 7
Y JOGL / OPENGL in Frame Spiele- und Multimedia-Programmierung 11
A JOGL Würfel hat durchsichtige Seiten? Spiele- und Multimedia-Programmierung 13
N Jogl Probleme mit dem Buffer beim laden einer Textur Spiele- und Multimedia-Programmierung 2
A Bewegungen mit JOGL Spiele- und Multimedia-Programmierung 12
P JOGL Button-klick-Problem Spiele- und Multimedia-Programmierung 2
S Jogl Problem bei Darstellung Spiele- und Multimedia-Programmierung 9
G JOGL Color stimmt nicht Spiele- und Multimedia-Programmierung 3
S JOGL Maven Dependency Spiele- und Multimedia-Programmierung 7
Developer_X JOGL - Sichtweite Spiele- und Multimedia-Programmierung 3
Developer_X JOGL Texturing Spiele- und Multimedia-Programmierung 31
Developer_X JOGL- Ich möchte mitmachen! Spiele- und Multimedia-Programmierung 23
X JOGL GL Kontext Initialisierung Spiele- und Multimedia-Programmierung 3
X Vertex Buffer Objects mit JOGL Spiele- und Multimedia-Programmierung 7
A JOGL / OpenGL Spiele- und Multimedia-Programmierung 7
P JOGL Cubemap Spiele- und Multimedia-Programmierung 7
P JOGL Installation Spiele- und Multimedia-Programmierung 15
J JOGL - Bild wird immer wieder weiß Spiele- und Multimedia-Programmierung 2
Antoras J3D / JME oder JOGL Spiele- und Multimedia-Programmierung 2
P GLSL in JOGL Spiele- und Multimedia-Programmierung 15
S jogl ins system einbinden Spiele- und Multimedia-Programmierung 3
W JOGL bleibt nach display() in PaintArea.paintComponent hängen Spiele- und Multimedia-Programmierung 5
S java /jogl /Texturen mit j3d Spiele- und Multimedia-Programmierung 3
S JOGL Fonts Spiele- und Multimedia-Programmierung 4
S JOGL Selection By Color Spiele- und Multimedia-Programmierung 3
H JoGL mit Anwendung verteilen... Spiele- und Multimedia-Programmierung 9
0x7F800000 weiß einer wozu ANTLR beim build von JOGL verwendet wird? Spiele- und Multimedia-Programmierung 3
H Jogl-Animator - Inhalt ändert sich nicht Spiele- und Multimedia-Programmierung 4
S JOGL + Multithreading Spiele- und Multimedia-Programmierung 2
P Probleme mit Vista und JOGL Spiele- und Multimedia-Programmierung 2
J Alpha Blending (jogl) Spiele- und Multimedia-Programmierung 5
G JOGL - glTranslate - Unterschiede bei zweimal Ausführen Spiele- und Multimedia-Programmierung 9
Kr0e Schattenproblem, JOGL, gluPerspective. Spiele- und Multimedia-Programmierung 2
J OpenGL (JOGL) - Radial Blur Effekt (Glow) Spiele- und Multimedia-Programmierung 2
J jogl - verschiedene Versionen Spiele- und Multimedia-Programmierung 7
Kr0e "gluSphere" (JOGL) soll Schatten werfen können Spiele- und Multimedia-Programmierung 5
A JOGL, Models Spiele- und Multimedia-Programmierung 4
A JOGL, etwas Grundlegendes Spiele- und Multimedia-Programmierung 8
Kr0e JOGL & Anpassung ins Fenster Spiele- und Multimedia-Programmierung 2
G JOGL: per Mausbewegung Objekt verschieben Spiele- und Multimedia-Programmierung 2
S In JOGL Java einbauen Spiele- und Multimedia-Programmierung 5
S Java 3D, JOGL, . Spiele- und Multimedia-Programmierung 3
P JOGL: mit glTranslated wird nichts gezeichnet Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben