JOGL Programmierung - glRotatef()

Hayzle

Mitglied
Hallo zusammen,

ich belege im Moment an der Uni einen Kurs Grafikprogrammierung. Ich habe damit bisher wenig am Hut gehabt, aber in Java recht gute Kenntnisse.
Auf jeden Fall nutzen wir JOGL 1.1.1a.

Wir sollen einen Tetraeder zeichnen, dieser soll sich um die y-Achse dreht, der Winkel soll abhängig von der Systemzeit sein.

Den Tetraeder zeichnen bekomme ich hin, ich weiß auch, wie der Befehl glRotatef() zu benutzen ist und schaffe es auch ihm die Systemzeit mittels System.currentTimeMillis() als Winkel zu übergeben.

Jetzt das Problem: Das ganze passiert nur einmal, sprich er dreht das ganze um einen bestimmten Winkel und dann steht es. Es soll sich aber kontinuierlich drehen, wie schaffe ich das?
Muss ich da das Modell immer neu zeichnen und drehen?

Schonmal vielen Dank für die Antworten =)

Grüße!
Hayzle
 
G

Guest2

Gast
Moin,

ja, Du must den Winkel abhängig von der Zeit zwischen zwei Frames erhöhen. Etwa so:

Java:
    private static final double Y_ROTATION_SPEED = 0.5 * 360 * 1E-9;

    private double              yRotation        = 0;
    private long                time             = 0;

[..]

   @Override
    public void display(final GLAutoDrawable drawable) {

        final long deltaTime = (-(time - (time = System.nanoTime())));
        final double deltaRotation = Y_ROTATION_SPEED * deltaTime;

        yRotation += deltaRotation;
        yRotation %= 360;

        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);

        gl.glLoadIdentity();
        gl.glRotatef((float) yRotation, 0.0f, 1.0f, 0.0f);

[..]

}

Viele Grüße,
Fancy
 

Hayzle

Mitglied
Kannst du das näher erklären? Ich verstehe nicht, was du mit "zwischen zwei Frames" meinst.

Meine Display Methode sieht im Moment so aus:

Java:
public void display(GLAutoDrawable drawable) {
		// obtain GL to draw to the framebuffer
		GL gl = drawable.getGL();
		
		// clear the framebuffer
		gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
		
		// place object into the scene
		gl.glLoadIdentity();
		gl.glTranslatef(0.0f, 0.0f, -4.0f);
		
		
		float time = System.currentTimeMillis();
		gl.glRotatef(time, 0.0f, 1.0f, 0.0f);
			
		
		
		// draw a triangle 
		gl.glBegin(GL.GL_TRIANGLES);

	
		gl.glColor3f(1.0f, 1.0f, 1.0f);
		gl.glVertex3f(-1.0f, -1.0f, 1.0f);
		gl.glVertex3f(1.0f, -1.0f, 1.0f);
		gl.glVertex3f(0.0f, 0.5f, 0.0f);
		
		gl.glColor3f(0.0f, 0.0f, 1.0f);
		gl.glVertex3f(0.0f, -1.0f, -0.9f);
		gl.glVertex3f(-1.0f, -1.0f, 1.0f);
		gl.glVertex3f(0.0f, 0.5f, 0.0f);
		
		gl.glColor3f(1.0f, 0.0f,0.0f);
		gl.glVertex3f(1.0f, -1.0f, 1.0f);
		gl.glVertex3f(0.0f, -1.0f, -0.9f);
		gl.glVertex3f(0.0f, 0.5f, 0.0f);
	
		gl.glEnd()		
		
	}

Ich vermute, mein Problem ist, dass ich nicht weiß, was glClear() und glLoadIdentity() machen. Werde die mal nachgucken, vielleicht wirds dann klarer..
 
G

Guest2

Gast
Die display() wird nicht nur einmal aufgerufen, sondern jedes Mal neu, für jedes Bild, das die Grafikkarte berechnet. Je nach Grafikkarte und Einstellungen passiert das ca. 60 bis 6000 Mal pro Sekunde.

glClear() macht das, was in Deinem Quellcode als Kommentar steht, es löscht den Framebuffer. Dann ist wieder alles "sauber" und das nächste Frame kann gezeichnet werden. Üblicherweise taucht das innerhalb einer display() immer irgendwo am Anfang auf.

glLoadIdentity() setzt die aktuelle Transformationsmatrix zurück. Innerhalb der display() ist das üblicherweise die ModelView-Matrix. Alle Transformationen (Verschieben, Rotieren, usw.) werden auf die aktuelle Transformationsmatrix aufmultipliziert und gelten dann solange, bis die Matrix wieder zurückgesetzt wird. glLoadIdentity() sollte ebenfalls irgendwo am Anfang der display() auftauchen, um einen definierten Anfangszustand zu haben.

Um Dein Tetraeder nun drehen zu können, must Du ihn jedes Frame ein kleines Stückchen weiterdrehen. Wie stark Du ihn drehen musst, hängt davon ab, wie viel Zeit seit dem letzten Frame vergangen ist. Du must diese Zeitdifferenz mit der gewünschten Rotationsgeschwindigkeit multiplizieren und auf einen Winkel zwischen 0 und 360° abbilden.

Vollständig sieht das dann etwa so aus:
(Btw. Dein Tetraeder ist verzogen ;) )

Java:
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;

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

import com.sun.opengl.util.Animator;


public final class RotationSample implements GLEventListener {

    private static final double Y_ROTATION_SPEED = 0.5 * 360 * 1E-9;

    private double              yRotation        = 0;
    private long                time             = 0;


    @Override
    public void init(final GLAutoDrawable drawable) {

        final GL gl = drawable.getGL();

        gl.glEnable(GL.GL_DEPTH_TEST);

    }


    @Override
    public void display(final GLAutoDrawable drawable) {

        final long deltaTime = (-(time - (time = System.nanoTime())));
        final double deltaRotation = Y_ROTATION_SPEED * deltaTime;

        yRotation += deltaRotation;
        yRotation %= 360;

        final GL gl = drawable.getGL();

        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

        gl.glLoadIdentity();
        gl.glTranslatef(0.0f, 0.0f, -4.0f);
        gl.glRotatef((float) yRotation, 0.0f, 1.0f, 0.0f);

        gl.glBegin(GL.GL_TRIANGLES);

        gl.glColor3f(1.0f, 1.0f, 1.0f);
        gl.glVertex3f(-1.0f, -1.0f, 1.0f);
        gl.glVertex3f(1.0f, -1.0f, 1.0f);
        gl.glVertex3f(0.0f, 0.5f, 0.0f);

        gl.glColor3f(0.0f, 0.0f, 1.0f);
        gl.glVertex3f(0.0f, -1.0f, -0.9f);
        gl.glVertex3f(-1.0f, -1.0f, 1.0f);
        gl.glVertex3f(0.0f, 0.5f, 0.0f);

        gl.glColor3f(1.0f, 0.0f, 0.0f);
        gl.glVertex3f(1.0f, -1.0f, 1.0f);
        gl.glVertex3f(0.0f, -1.0f, -0.9f);
        gl.glVertex3f(0.0f, 0.5f, 0.0f);

        gl.glEnd();

    }


    @Override
    public void reshape(final GLAutoDrawable drawable, final int x, final int y, final int width, final int height) {

        final GL gl = drawable.getGL();
        final GLU glu = new GLU();

        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        glu.gluPerspective(45.0f, (float) width / (float) height, 0.1f, 100.0f);

        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();

    }


    @Override
    public void displayChanged(final GLAutoDrawable drawable, final boolean arg1, final boolean arg2) {

    }


    public static void main(final String[] args) throws IOException {

        final RotationSample base = new RotationSample();
        final Frame frame = new Frame();
        final GLCanvas canvas = new GLCanvas();
        final Animator animator = new Animator(canvas);

        canvas.addGLEventListener(base);
        frame.add(canvas);
        frame.setSize(500, 400);
        frame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(final WindowEvent e) {

                new Thread(new Runnable() {

                    @Override
                    public void run() {

                        animator.stop();
                        System.exit(0);

                    }

                }).start();
            }
        });

        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        animator.start();

    }


}

Viele Grüße,
Fancy
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Jogl und Java 3d AWT, Swing, JavaFX & SWT 0
S Jogl und JavaFX AWT, Swing, JavaFX & SWT 6
K Jogl tutorial gesucht AWT, Swing, JavaFX & SWT 2
N JOGL-Code != C OpenGL-Code? AWT, Swing, JavaFX & SWT 9
D 3D-Grafik [JOGL] streifen im bild AWT, Swing, JavaFX & SWT 2
E 3D-Grafik JOGL (lädt sehr lange) AWT, Swing, JavaFX & SWT 20
M 2D-Grafik Performante Scatterplots mit J2d oder jOGL AWT, Swing, JavaFX & SWT 3
D 3D-Grafik Jogl download AWT, Swing, JavaFX & SWT 7
-horn- WorldWindJava+JOGL soll einen animierten Graphen anzeigen, wie? AWT, Swing, JavaFX & SWT 4
M java2D/jogl interoperability AWT, Swing, JavaFX & SWT 22
J 3D-Grafik JOGL - Verschiedene Perspektiven darstellen AWT, Swing, JavaFX & SWT 5
S Swing Komponente mit jogl AWT, Swing, JavaFX & SWT 18
T Jogl? AWT, Swing, JavaFX & SWT 2
J GUI Programmierung Popup-Menü AWT, Swing, JavaFX & SWT 4
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
MiMa GUI Programmierung AWT, Swing, JavaFX & SWT 19
A GUI-Programmierung AWT, Swing, JavaFX & SWT 4
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
D Swing Swing und Programmierung auf Schnittstellen AWT, Swing, JavaFX & SWT 2
R GUI Programmierung AWT, Swing, JavaFX & SWT 3
M Tipps für Gui-Programmierung? AWT, Swing, JavaFX & SWT 9
M GUI-Programmierung - GUI-Builder oder eigenständig? AWT, Swing, JavaFX & SWT 16
G Generelle Vorgehensweise Eventhandling bei GUI Programmierung AWT, Swing, JavaFX & SWT 14
H Struktur für Gui-Programmierung AWT, Swing, JavaFX & SWT 2
U java 6 Programmierung AWT, Swing, JavaFX & SWT 5
A Wecker-Programmierung mit GUI AWT, Swing, JavaFX & SWT 3
F JList und saubere Programmierung AWT, Swing, JavaFX & SWT 4
H Java Ascii Rechner Programmierung AWT, Swing, JavaFX & SWT 4
T Problem mit der Programmierung von Fenster und deren Inhalte AWT, Swing, JavaFX & SWT 4
N thread programmierung AWT, Swing, JavaFX & SWT 2
W Nebenläufige Programmierung AWT, Swing, JavaFX & SWT 6
A grundsätzliches Vorgehen für GUI Programmierung AWT, Swing, JavaFX & SWT 6
M einfache Frage über SWT GUI-Programmierung AWT, Swing, JavaFX & SWT 3
S Richtiges Vorgehen bei GUI-Programmierung AWT, Swing, JavaFX & SWT 7
S GUI Programmierung AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben