Wann/wie glTranslated für Weltkoordinaten aufrfen



  • Ich raff's nicht, das hier ist meine Schleife:

    gPositionWorld.tx = 10.0;
    gPositionWorld.ty = 20.0;
    
    while (glfwGetWindowParam (GLFW_OPENED)) {
    	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    	glTranslated(-gPositionWorld.tx, -gPositionWorld.ty, 0.0);	
    
    	display(); // Zeichnet direkt in Weltkoordinaten
    
    	glfwSwapBuffers();
    

    Ich will mich also fix nach 10.0,20.0,0.0 bewegen und mir anschauen, was dort los ist. Da ich in display() direkt in Weltkoordinaten zeichne, sehe ich auch anfangs ganz kurz die "richtige" Szenerie. Danach wird die Kamera woanders hingesetzt, allerdings nicht nach 0,0,0, denn dort zeichne ich ein Rechteck um zu prüfen ob ich beim Ursprung bin.

    Wo ist denn mein Fehler 😕



  • Ich hab mit dem alten gl noch nie gearbeitet, aber: https://msdn.microsoft.com/en-us/library/windows/desktop/ee872065(v=vs.85).aspx

    The glTranslated function multiplies the current matrix by a translation matrix.

    Mal probiert glTranslated nur ein mal aufzurufen?



  • Ok, das augenscheinliche Problem ist folgendes:

    Jeder Aufruf von glTranslated summiert sich. Somit muss ich nur 1x mit den Werten von -gPositionWorld.tx, -gPositionWorld.ty aufrufen, danach müsste ich 0 bzw. die relative Bewegungsänderung übergeben.

    Problem:
    Es scheint so, als ob 10-20 Frames benötigt werden, damit im obigen Code glTranslated überhaupt eine Auswirkung hat. Ich schaue mir bei jedem Durchgang die ModelViewMatrix an:

    GLdouble params[16];
    		glGetDoublev(GL_MODELVIEW_MATRIX, params);
    

    Und ich sehe ganz klar, dass erst nach einigen Frames die Weltposition in der Matrix auftaucht und dann mit jedem weiteren Frame aufsummiert wird.

    Wieso ist da so eine Verzögerungszeit und wie kann ich das verhindern?!



  • Hi!

    Zur beobacteten "Verzögerung" kann ich leider nichts sagen, aber was das "aufsummieren" angeht, so setzt man üblicherweise in jedem Frame die Modelview-Matrix erstmal auf die Einheitsmatrix und wendet dann die View- und Welt-Transformationen an:

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glLoadIdentity(); // Einheitsmatrix laden, also ModelView-Matrix "zurücksetzen"
    
        ... // Hier könnte eine View-Transformation stehen, also die inverse Transformation der "Kamera".
    
        glTranslated(-gPositionWorld.tx, -gPositionWorld.ty, 0.0); 
    
        display(); // Zeichnet direkt in Weltkoordinaten
    
        glfwSwapBuffers();
    

Anmelden zum Antworten