OpenGL-Translatation nicht flüssig



  • Hi Leute,
    ich hab ein Problem. Und zwar bin ich dabei, mich mit den Pfeiltasten durch eine "Map" zu bewegen. Allerdings will das nicht so ganz funktionieren. Ich dachte mir, ich könnte es so aufbauen:

    int DrawGLScene(GLvoid)
    {
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    
    glTranslatef(trans_x,trans_y,trans_z);
    glRotatef(rot_x,0.0f,1.0f,0.0f);
    
    glPushMatrix();
    Draw_Box();
    glPopMatrix();
    
    glPushMatrix();
    Draw_Grid();
    glPopMatrix();
    
    trans_speed=0.0;
    rot_speed=0.0;
    if(keys[VK_UP])
    {
    	glClearColor(0.0f,0.0f,0.0f,0.0f);
    	rot_x*trans_z*180.0;
    	trans_speed+=0.3f;
    	trans_z+=trans_speed;
    	return keys[VK_UP]=false;
    }
    
    if(keys[VK_DOWN])
    {
    	trans_speed+=0.3f;
    	trans_z-=trans_speed;
    	return keys[VK_DOWN]=false;
    }
    if(keys[VK_RIGHT])
    {
    	rot_speed+=1.3f;
    	trans_x*rot_x*180.0f;
    	rot_x+=rot_speed;
    	return keys[VK_RIGHT]=false;
    }
    
    glPushMatrix();
    glRasterPos2f(-2.0f,3.50f); 
    glPrint("Begib dich zur Kiste",cnt1);
    glPopMatrix();
    
    return TRUE;
    }
    

    Wenn ich mich jetzt bewegen will, ruckelt es die ganze Zeit. Ich nehme an, weil ich den booleschen Wert zurückgebe und dann wieder Abfrage. Was kann ich da wohl machen? Im Nehe-Tutorial macht er doch auch nicht's anderes.



  • if(keys[VK_UP])
    {
    // ...
        keys[VK_UP]=false; 
    // ...
    

    Du forcierst hier, dass die Taste nicht mehr gedrueckt ist (die Bewegung also zunaechst abgebrochen wird).
    Wegen automatischer Tastenwiederholung (wenn eine Taste gedrueckt gehalten wird) bekommst Du alle paar Sekundenbruchteile aber wieder einen Tasten-Event - es "ruckelt".



  • Hmmm...das war mir schon klar. Aber wie kann ich das Problemchen lösen? Mir fällt aboslut nix mehr ein...=(



  • Du darfst einfach die Tastendrücke nicht zurücksetzen. Da s=v*t ist, solltest Du außerdem die Zeit zwischen den Transformationen messen und dementsprechend:
    trans-=trans_speed * delta(t) rechnen und auf die breaks verzichten. Damit ist deine Simulation dann auch Prozessorunabhängig. Du solltest aber unbedingt auf performance counter zurückgreifen.



  • Hmm...ja aber wenn ich die Tasten nicht zurücksetze, durchläuft er die Tasten nur einmal und fragt sie auch nur einmal ab.



  • Dann solltest du dein input management noch mal überdenken. Ist mir etwas schleierhaft wieso der Tastendruck zurückgesetzt werden sollte wenn doch die Taste noch gedrückt ist 😕 (oder zeichnest du die Scene nur auf Tastendruck?)



  • Ja aber was bleibt mir anderes übrig? Wenn ich die Taste nicht zurücksetze, wird sie nureinmal durchlaufen und danach nicht mehr abgefragt!



  • Wenn ich die Taste nicht zurücksetze, wird sie nureinmal durchlaufen und danach nicht mehr abgefragt!

    Dann solltest Du genau dort ansetzen - das ist naemlich Bloedsinn.



  • mmh, also ich nutze für kleinere Sachen gern die NeHe Variante:

    private:
        bool aKey[256]; //mit false initialisieren
    
    //  key handling
    OnKeyDown( char nChar )
    {
        aKey[nChar] = true;
    }
    
    OnKeyUp( char nChar )
    {
        aKey[nChar] = false;
    }
    
    DrawGlScene()
    {
        //...
        if(aKey[VK_LEFT])
        {
            //...
        }
        //...
    }
    

Log in to reply