glMultMatrix



  • Hi!!!

    Ich bin noch relativer Anfänger mit OpenGL und bräuchte mal eure Hilfe. Ich möchte, dass meine Matrix (die momentan angezeigt wird) immer wieder als aktuelle Matrix gesehen wird (ihr merkt schon, ich kann mich auch nicht gerade sonderlich gut ausdrücken, aber das wird noch 🙂 ), nicht die Ursprungsmatrix.
    Hier mein Quellcode:

    wm = FrMain->ClientWidth;
        hm = FrMain->ClientHeight;
        glViewport(0,0,wm,hm);       
        glLoadMatrixf(ObjMatrix);
        glLoadIdentity();
        if(!ortho) gluPerspective(pangle, aspect, 0.1, 10000.0);
        if(ortho) glOrtho((-dimmax/sf)*sx,(dimmax/sf)*sx, (-dimmax/sf)*sy, (dimmax/sf)*sy, -10000, 10000);
    
        if(readyToDraw) {
          readyToDraw = false;                            // neuer Durchlauf hat begonnen
    
          glPushMatrix();
          glTranslatef(xslide/pfa, yslide/pfa,-(2.5*dimz));        //Verschieben des Objekts
          glScalef(yzoom/sdiv, yzoom/sdiv, yzoom/sdiv);  //Skallieren
          glPointSize(pointsize);                        //Punktdicke
    
          glRotatef(anglex,1.0,0.0,0.0);                  //Rotieren X
          glRotatef(angley,0.0,1.0,0.0);                  //Rotieren Y
          glGetFloatv(GL_MODELVIEW_MATRIX, ObjectMatrix);
          glLoadIdentity();
          glMultMatrixf(ObjMatrix);
    
          Label1->Caption = anglex;
          Label2->Caption = angley;
    
          /*Objekte einlesen / zeichnen*/
          DrawScene(); //Zeichnen des Objektes
          glPopMatrix();
          readyToDraw = true;
        } // Durchlauf beendet
    

    Das entscheidene hier sind die Aufrufe glMultMatrix und glLoadMatrix. Ich habe dazu ein float-Array [16] ObjMatrix angelegt. Jetzt möchte ich, dass er die Matrix nach jedem Durchlauf in dem Aray speichert (müsste er ja mit glMultMatrix machen) und beim nächsten Durchlauf als aktuelle Matrix sieht. Leider funktioniert das nicht wirklich. Ich denke, dass ich entweder was vergessen habe, oder irgendwie falsch angeordnet habe. Könnt ihr mir helfen?

    Danke sehr

    [ Dieser Beitrag wurde am 19.05.2003 um 14:11 Uhr von Hoeen editiert. ]



  • ich glaube du willst einfach, dass jedes objekt ein eigenes koorinaten system hat, oder?!

    wenn dann nimm einfach das:



  • ich glaube du willst einfach, dass jedes objekt ein eigenes koorinaten system hat, oder?!

    wenn dann nimm einfach das:

    glLoadIdentity();
    glPopMatrix();
    glPushMatrix(); 
    glTranslatef(mPos.x, mPos.y,mPos.z);
    glScalef(mScale.x, mScale.y, mScale.z);
    glRotatef(mRot.x, 1, 0, 0);
    glRotatef(mRot.y, 0, 1, 0);
    glRotatef(mRot.z, 0, 0, 1);
    

    so müsste es passen (kann sein, dass glTranslate, glRotate und glScale in falscher reihenfolge sind ...)



  • hm, klappt so nicht, dann zeigt er gar nichts an 🙂 aber genau das ist mein Problem. ich möchte, das jedes Objekt ein eigenes Koordinatesystem hat. Also dass jede neue Matrix ein neues Koordinatensystem hat 🙂



  • ich glaube du verwechselt da was:
    eine matrix dient nur dazu um vektoren zu transformieren und ist nicht ein anderes wort für objekt 🙂

    machs für jedes objekt so:

    glLoadIdentity();
    glPopMatrix();
    glPushMatrix();
    glTranslatef(mPos.x, mPos.y,mPos.z);
    glScalef(mScale.x, mScale.y, mScale.z);
    glRotatef(mRot.x, 1, 0, 0);
    glRotatef(mRot.y, 0, 1, 0);
    glRotatef(mRot.z, 0, 0, 1);
    //DEIN OBJEKT HIER ZEICHNEN

    glLoadIdentity();
    glPopMatrix();
    glPushMatrix();
    glTranslatef(mPos.x, mPos.y,mPos.z);
    glScalef(mScale.x, mScale.y, mScale.z);
    glRotatef(mRot.x, 1, 0, 0);
    glRotatef(mRot.y, 0, 1, 0);
    glRotatef(mRot.z, 0, 0, 1);
    //NÄCHSTES OBJEKT HIER ZEICHNEN

    //USW...

    Der Code macht folgendes (ich hoffe ,dass ich das jetzt richtig erklären kann...)
    am anfang sind die koordinaten 0, 0, 0; diese koordinaten kannst du mit glLoadIdentity wiederherstellen; das hat also zur folge, dass ohne glTranslate(...) jedes objekt im 0,0,0 punkt gezeichnet würde.
    mit glTranslate verschiebst du praktisch das ganze system zu den neuen koordinaten (also ist der punkt 0,0,0) jetzt nicht mehr der eigentliche 0,0,0 punkt sondern eben der punkt den du mit glTranslatef(...) gesetzt hast;
    jetzt zeichnest du das objekt an diesen ort.
    mit glLoadIdentity() springst du wieder zum eigentlichen 0,0,0 punkt zurück und du kannst mit glTranslatef(..) wieder neue koordinaten für das nächst obj angeben.

    ich hoffe mal, dass dir das geholfen hat. ich kenn mich (auch?) nicht wirklich mit matricen aus. was solls 😃

    PS: wenn ich so drübernachdenke ist das glPopMatrix und pushMatrix gar nicht mal notwendig (verwends aber trotzdem, bei mir funktioniert es so auf jeden fall; wird schon seinen grund haben dass ich das mal probiert habe :D)



  • Hi!

    Ich bin's nochmal! Ich habe es jetzt folgendermassen gemacht:

    wm = FrMain->ClientWidth;
        hm = FrMain->ClientHeight;
        glViewport(0,0,wm,hm);       /* Establish viewing area to cover entire window. */
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        if(!ortho) gluPerspective(pangle, aspect, 0.1, 10000.0);
        if(ortho) glOrtho((-dimmax/sf)*sx,(dimmax/sf)*sx, (-dimmax/sf)*sy, (dimmax/sf)*sy, -10000, 10000);
    
        if(readyToDraw) {
          readyToDraw = false;                            // neuer Durchlauf hat begonnen
    
          glPopMatrix();
          glPushMatrix();
          glTranslatef(xslide/pfa, yslide/pfa,-(2.5*dimz));
          glScalef(yzoom/sdiv, yzoom/sdiv, yzoom/sdiv);
          glRotatef(anglex, 1, 0, 0);
          glRotatef(angley, 0, 1, 0);
    
          Label1->Caption = anglex;
          Label2->Caption = angley;
    
          /*Objekte einlesen / zeichnen*/
          DrawScene();
          CrissCross(dimmax, yzoom/sdiv);
          readyToDraw = true;
        } // Durchlauf beendet
    

    Das klappt auch soweit sehr gut, jedoch noch nicht wirklich so, wie ich es wollte 😞
    Das Problem ist folgendes: Er dreht bei bestimmten Vorraussetzungen falsch. Wenn man zum Beispiel X um 90 und Y um 90° dreht. Er soll nun ein neues Koordinatenkreuz erstellen, bei dem wieder X und Y im Vordergrund liegen und nicht gedreht sind. Also quasi eigentlich alle Werte wieder auf 0 setzen, aber das aktuelle Objekt so stehen lassen, wie es ist, also nicht wieder zum Ursprung zurücksetzten. Nun soll er das Objekt um das neue Kreuz drehen. Das klappt leider so nicht.
    Das Problem müssten doch schon mehrere Leute haben, oder drücke ich mich einfach nur zu doof aus 🙂



  • Hi!

    Habe wieder ausprobiert. ich bin jetzt nochmal einen anderen weg gegangen. Mein Problem ist im Moment, dass ich falsch rotiere. Ich rotiere per Mouse-Bewegung und da ich ja nur 2 Ebenen habe, bleibt eine Achse immer aus. Wenn ich jetzt zum Beispiel um x und um y jeweils 90 Grad drehe, müsste die Z-Achse nach oben "zeigen" und die X Achse nach Rechts. drehe ich nun die Mouse nach links oder rechts, sollte sich das Objekt um z drehen, tut es aber nicht. Es dreht um y, also falsch. Hier der Quellcode:

    if(mbRotation)
    {
    glPushMatrix();
    
    glTranslatef(0, 0,-(2*dimz+(keyz/pfa)));
    
    glGetFloatv(GL_MODELVIEW_MATRIX, _m1);
    glTranslatef(xslide, yslide, 0);
    glScalef(scalediv, scalediv, scalediv);
    glPointSize(pointsz); //Punktdicke
    glLoadIdentity();
    
    glRotatef(angle_x, 1, 0, 0);
    glRotatef(angle_y, 0, 1, 0);
    
    //ModelTransform();
    mbRotation = false;
    
    // Apply the current transforms
    glMultMatrixf( _m1 );
    
    // And keep the modified transform matrix
    glGetFloatv( GL_MODELVIEW_MATRIX, _m1 );
    
    glPopMatrix();
    }
    // Now apply the accumulated rotations
    glMultMatrixf( _m1 );
    DrawScene();
    CrissCross(dimmax, yzoom/sdiv);
    glFlush();
    SwapBuffers(hDC);
    readyToDraw = true;
    

    Ich denke, ich muss den Weg mit den Matrizen nehmen, leider klappt es auch so nicht wirklich. Er rotiert immer noch falsch (warum?).


Anmelden zum Antworten