lwjgl - Tetraeder Anzeigefehler

Jan102

Mitglied
Hallo zusammen, ich hab heute mit lwjgl angefangen und bin jetzt auf mein erstes Problem gestoßen. ;(
Ich versuche einen Tetraeder anzuzeigen und zu drehen. Das Drehen des Körpers funktioniert ohne Probleme, er wird nur nicht richtig angezeigt:

anzeigefehler.png


Java:
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

public class lwjgl_test {

	private static float rdreieck = 0.0f;

	public static void main(String[] args) {
		try {
			Display.setDisplayMode(new DisplayMode(800, 600));
			Display.setFullscreen(false);
			Display.create();
			// Mouse.create();
		} catch (LWJGLException e) {
			e.printStackTrace();
			System.exit(0);
		}
		initGL();
		run();
		System.exit(0);
	}

	private static void run() {
		while (!Display.isCloseRequested()) {
			GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
			GL11.glLoadIdentity();
			if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {
				break;
			}
			if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {
				rdreieck += 0.05;
			}
			if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) {
				rdreieck -= 0.05;
			}

			draw_triangle();
			Display.update();
		}

		Display.destroy();
		System.exit(0);
	}

	private static void initGL() {
		GL11.glEnable(GL11.GL_DEPTH_TEST);
		GL11.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
		GL11.glColor3f(0.0f, 0.0f, 0.0f);
		GL11.glPointSize(4.0f);
		GL11.glMatrixMode(GL11.GL_PROJECTION);
		GL11.glLoadIdentity();
	}

	private static void draw_triangle() {
		GL11.glPushMatrix();
		GL11.glTranslatef(0.0f, 0.0f, 0.0f);

		GL11.glRotatef(rdreieck, 0.0f, 1.0f, 0.0f);
		GL11.glBegin(GL11.GL_TRIANGLES);
		GL11.glColor3f(0.0f, 0.0f, 1.0f); // das vordere soll blau werden
		GL11.glVertex3f(0.0f, 1.0f, 0.0f); // oben (vorderes Dreieck)
		GL11.glVertex3f(-1.0f, -1.0f, 1.0f); // links (vorderes Dreieck)
		GL11.glVertex3f(1.0f, -1.0f, 1.0f); // rechts (vorderes Dreieck)

		GL11.glColor3f(1.0f, 0.0f, 0.0f); // das rechte soll rot werden
		GL11.glVertex3f(0.0f, 1.0f, 0.0f); // oben (rechtes Dreieck)
		GL11.glVertex3f(1.0f, -1.0f, 1.0f); // links (rechtes Dreieck)
		GL11.glVertex3f(1.0f, -1.0f, -1.0f); // rechts (rechtes Dreieck)

		GL11.glColor3f(0.0f, 1.0f, 0.0f); // das hintere grÃŒn
		GL11.glVertex3f(0.0f, 1.0f, 0.0f); // oben (hinteres Dreieck)
		GL11.glVertex3f(1.0f, -1.0f, -1.0f); // links (hinteres Dreieck)
		GL11.glVertex3f(-1.0f, -1.0f, -1.0f); // rechts (hinteres Dreieck)

		GL11.glColor3f(1.0f, 1.0f, 0.0f); // und das linke gelb
		GL11.glVertex3f(0.0f, 1.0f, 0.0f); // oben (linkes Dreieck)
		GL11.glVertex3f(-1.0f, -1.0f, -1.0f); // links (linkes Dreieck)
		GL11.glVertex3f(-1.0f, -1.0f, 1.0f); // rechts (linkes Dreieck)
		GL11.glEnd();
		GL11.glPopMatrix();
	}

}


Danke im Voraus für eure Lösungsvorschläge.
 

Marco13

Top Contributor
Sieht aus als würde er einfach durch die vordere Clipping plane ragen. Füg' mal
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glTranslatef(0,0,5); // (oder -5 ...)
ein. Wenn nicht, kann man nochmal genauer schauen..
 

Jan102

Mitglied
Ne geht auch nicht. Bei zu große postiven und negativen Werten verschwindet der Körper einfach. Außerdem ragt er auch hinten "heraus"?
 

Marco13

Top Contributor
Ja, es wird nirgendwo eine Matrix für das Viewing-Volume gesetzt... dann wird dort offenbar irgendein Standardwert verwendet... OpenGL zeigt das an, was im Viewing Volume liegt, wie in diesem Bild

Image63.gif

Von Chapter 3 - OpenGL Programming Guide (etwa in der Mitte, bei "Orthographic projection");

Wenn etwas näher am Betrachter ist, als die "near"-Ebene (wie in deinem Fall, die Ecke des gedrehten Tetraeders) wird es nicht angezeigt. Man kann das Viewing Volume mit glOrtho, glFrustum pder gluPerepective einstellen:
Java:
    private static void draw_triangle() {
        GL11.glPushMatrix();
        GL11.glOrtho(-1, 1, -1, 1, 0, 100);
        GL11.glTranslatef(0.0f, 0.0f, 0.0f);
 

Jan102

Mitglied
Ich hab eben auch nochmal einen Freund gefragt und er hat mir gesagt, ich soll die initgl Funktion verändern. Er hat mir dann seinen Code geschickt und damit hat es funktioniert, ohne weitere Änderungen zu machen. Dann hab ich noch zu GL11.glTranslatef(0.0f, 0.0f, -5.0f); geändert.
Jetzt funktioniert es.

Java:
private static void initGL() {
GL11.glEnable(GL11.GL_TEXTURE_2D);
    	GL11.glShadeModel(GL11.GL_SMOOTH);
    	GL11.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
    	GL11.glClearDepth(1.0D);
    	GL11.glEnable(GL11.GL_DEPTH_TEST);
    	GL11.glDepthFunc(GL11.GL_LEQUAL);

    	GL11.glMatrixMode(GL11.GL_PROJECTION);
    	GL11.glLoadIdentity();

    	GLU.gluPerspective(45.0f, Display.getDisplayMode().getWidth() / Display.getDisplayMode().getHeight(), 0.1f, 100.0f);
    	GL11.glMatrixMode(GL11.GL_MODELVIEW);

    	GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
    	GL11.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
 

Marco13

Top Contributor
Jo stimmt, glOrtho auf der Modelview-Matrix ist eigentlich :autsch: ... :oops: *Ausredesuch* Bei neueren OpenGL-Versionen (GL30 und höher) macht man das ja alles komplett anders ;)
 

Ähnliche Java Themen

Neue Themen


Oben