[OpenGL] "Textur" dreht sich ungewollt



  • Dann versteh ich dein Problem i-wie nicht...



  • also ich hab das problem folgendermaßen verstanden:

    der würfel wird um 90° gedreht, je nach eingabe entweder um die z-Achse oder die x-Achse.
    Dabei ist wohl das Problem, dass sich die Achsen mitdrehen. D.h. dass bei der nächsten drehung die Achsen vertauscht sind.

    Nehmen wir an, wir drehen den Würfel um 90° im Uhrzeigersinn. Dann bleibt die Z-Achse gleich, aber die X- und die Y-Achse vertauschen sich. Solange man nur rechts und links drehen würde, wäre das ja kein problem.
    Nun will unser Stier aber auch nach vorne und nach hinten rotieren, was jetzt aber schwierig wird, da die Achsen ja vertauscht sind.

    glRotatef((float) zRoll, xaxis, 0.0f, zaxis); 
    glRotatef((float) xRoll, xaxis, 0.0f, zaxis);
    

    Anhand von xaxis und zaxis nehme ich an, dass du schon versucht hast, den Würfel jeweils relativ zu den Achsen zu drehen. Evtl. kannst du mal den code dafür posten...

    Ich glaube was hier gebraucht wird ist irgendwas, was die Mitrotation der Achsen verhindert.

    Ich selber hab da leider nich so viel ahnung von...

    .eraemaajaervi



  • Ja, da hab ich ja schon mehrere versionen ausprobiert. z.b. die nachfolgende:

    int RollCorrect(int zRoll)                             // fixing, around which axis the cube shall rotate
    {
        //signed int sign=zRoll / abs(zRoll);               // when pressen left or right (makes problems, needs to be fixed)
        if(abs(zRoll)== 360) 
        {
                             //zRoll=0; //1*(zRoll%360); 
        }
        if(zRoll >= 0) 
        {
             if(zRoll%270==0) setRollAxis(0,-1,0);  // needs to be negative when degree is negative
             if(zRoll%270!=0 && zRoll%180==0) setRollAxis(0,0,-1);
             if(zRoll%270!=0 && zRoll%180!=0 && zRoll%90==0) setRollAxis(0,1,0); // needs to be negative when degree is positive
             if(zRoll==0) setRollAxis(0,0,1); 
        }
        else 
        {
             if(zRoll%270==0) setRollAxis(0,1,0);  // needs to be negative when degree is negative
             if(zRoll%270!=0 && zRoll%180==0) setRollAxis(0,0, -1);
             if(zRoll%270!=0 && zRoll%180!=0 && zRoll%90==0) setRollAxis(0,-1,0); // needs to be negative when degree is positive
             if(zRoll%360==0 || zRoll==0) setRollAxis(0,0,1); 
        } 
        return 0; 
    }
    

    Der ganze Code prüft eigentlich nur, um welche Achse letztendlich gedreht werden soll, da sich die lokalen achsen ja mitdrehen und so eine drehung nur um x und z achse zu definieren zu rotationsfehlern führen müsste.
    Es gibt noch einen ähnlichen code (etwas ausführlicher), aber der funktioniert genauso wenig.



  • Guck dir mal glPop/PushMatrix an... 😕



  • Oder du versuchst absolut zu drehen und machst vor dem Rendern ein GLLoadIdentity().



  • Mach mal ein Video per Screencapturing, dass man sich auch vorstellen kann, was du meinst 😉



  • leider funktioniert das mit screen capturing unter vista nicht richtig, daher hab ich mal 3 screenshots gemacht, die sollten ausreichen:
    Bild_1
    Bild_2
    Bild_3

    Wie man sieht dreht die textur sich einfach so zurück als wenn nichts passiert ist (die verschiebung bleibt bestehen). und es ist ja auch nicht so, dass ich den winkel, um den gedreht wurde, zurücksetzte...



  • Um es mal etwas konkreter zu machen:
    Download

    Das Problem will einfach nicht weg. Verstehen tu ich das schon lang nicht mehr 😡. An den Variablen kanns nicht mehr liegen, habe jede einzeld überprüft...war ne menge Arbeit. Ich hoffe, jemnad weis noch eine Lösung.

    edit:

    q: runter
    w: vorwärts
    e: rauf
    a: links
    s: zurück
    d: rechts

    VK_UP: Würfel vorwärts
    VK_LEFT: Würfel links
    VK_DOWN: Würfel zurück
    VK_RIGHT: Würfel rechts



  • Stier X schrieb:

    VK_UP: Würfel vorwärts
    VK_LEFT: Würfel links
    VK_DOWN: Würfel zurück
    VK_RIGHT: Würfel rechts

    Liegt vllt in diesen Codestücken der Hund begraben?



  • glaub ich kaum. dennoch:

    if (keys[VK_UP] && keyup[VK_UP] && !RollWay.down && !RollWay.left && !RollWay.right) {
                            RollWay.up = true;
                            }
    keyup[VK_UP]=!keys[VK_UP];
    

    RollWay ist bool und sagt, ob und in welche richtung gedreht wird.
    Analog zu links, runter, rechts.

    if (RollWay.up==true){
                                  Cubeanglex -= IncCube;
                                  }
    

    Cubeanglex beschreibt die Drehung um die x-Achse. IncCube muss ein ganzzahliger Faktor von 90 sein.
    Analog zu links, runter, rechts - bei links und rechts wird mit Cubeanglez gearbeitet.

    if (Cubeanglex%90 == 0 && Cubeanglez%90 == 0 && (RollWay.up || RollWay.down || RollWay.left || RollWay.right)){
                                  RollWay.up = false;
                                  RollWay.down = false;
                                  RollWay.right = false;
                                  RollWay.left = false;
                                  if(Cubeanglex == 360 || Cubeanglex ==-360) Cubeanglex = 0;
                                  if(Cubeanglez == 360 || Cubeanglez ==-360) Cubeanglez = 0;
    

    Setzt alles zurück, wenn die Drehung beendet ist.

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		glLoadIdentity(); // ist dieses das LoadIdentity aus connans Beitrag?
                                // wenn ichs weg mache, ist alles schwarz...
    	glTranslatef(Camera.posx,Camera.posy,Camera.posz);	
           glTranslatef( 0.0f+xmove, 0.0f+ymove,-5.0f+zmove);
        if(RollWay.up || RollWay.down) {glRotatef(Cubeanglex, 1.0f, 0.0f, 0.0f);}
        if(RollWay.left || RollWay.right) {glRotatef(Cubeanglez, 0.0f, 0.0f, 1.0f);}
        DrawCube();
    	return TRUE;					
    }
    


  • So, habe jetzt glaube ich herausgefunden, warum es zu dieser Drehung kommt:

    Ich hatte nie beachtet, dass es einen Unterschied macht, erst um 90° um die x, 90° um die z und wieder 90° um die x-Achse zu drehen anstelle wie es fälschlicherweise in meinem Programm ist, dass um 180° um die x und dann 90° um die z-Achse gedreht wird.
    Das kommt daher, weil ich ja durch GLLoadIdentity() die Modelviewmatrix zurücksetzte. Jetzt muss erstmal um die 90x-90z-90x gedreht werden um dann weiter fortzufahren. Da aber in den Variablen xRoll und zRoll nur vermerkt wurde, dass um 180° insgesamt um die x und 90° insgesamt um die z-Ache gedreht werden soll, kam es eben manchmal zu unterschieden. Jetzt ist natürlich die Frage, wie ich dieses Problem umgehe.

    Bisher habe ich versucht, durch glGetDoublev (GL_MODELVIEW_MATRIX, Wuerfelmatrix) die Matrix nach dem Zeichnen des Würfels abzuspeichern und anschließend wieder nach glLoadIdentity() zu laden aber anscheinend funktioniert das (immer noch) nicht, denn alles bleibt wie vorher.
    Gibt es da auch noch eine andere Möglichkeit (am besten gleich etwas code, bitte 😃 ).



  • *Push*

    Sry für den Trippelpost aber iwie hatte ich nen doppelpost ganz unbeabsichtigt...


Anmelden zum Antworten