Zoomen mit Mausrad hat Verzögerung!?



  • Hallo!

    Ich entwickle z.Zt. eine MFC-Anwensung mit OpenGL-Einbindung und möchte meine 3D-Objekte gern zoomen.

    Also habe ich die OnMouseWheel()-Funktion überschrieben mit folgendem Code:

    BOOL CMfc_basicView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
    {
    
    //neuen Zoom errechnen	
    zoom = zoom + zDelta*0.0001;
    
    //Zoom ausführen mit korrektem Zentrum
    glTranslated( refVector[0], refVector[1], refVector[2]);
    glScaled(zoom, zoom,zoom);
    glTranslated( -refVector[0], -refVector[1], -refVector[2]);
    
    //Fenster neu aufbauen
    Invalidate(FALSE);
    
    return CView::OnMouseWheel(nFlags, zDelta, pt);
    }
    

    Ich habe aber einen sehr seltsamen Effekt: Drehe ich das Mausrad in eine Richtung, zoomen die Objekte korrekt. Ändere ich die Drehrichtung des Rades, so dauert es ein paar Drehungen, bis der Zoom ebenfalls in die andere Richtung geht. Je öfter ich die Richtung wechsle, desto länger dauert die Verzögerung.

    Fällt einem von Euch was dazu ein?

    Danke und Gruß,

    T.



  • Ohne deinen Source gelesen zu haben:

    Zoomen, wie beim Sniperrifle, macht man nicht mit Scalef.
    Dazu verändert man die Projektionsmatrix, Stichwort field of view.

    Oder meinst du mit Zoom jetzt was anderes als ich verstehe?



  • Hallo,

    ich denke, du arbeitest mit der Parallelprojektion (CAD Anwendung ... was sonst:-))), also:

    void __fastcall  KInit::ViewingVolumen()
    {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(OrthoXMin, OrthoXMax , OrthoYMin, OrthoYMax , OrthoZMin, OrthoZMax);
        gluLookAt( 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
        glMatrixMode ( GL_MODELVIEW );
    }
    

    Und nun halt nur noch dem entsprechendem Mouseevent die Änderungen ausführen lassen:

    kInit->OrthoXMax -= Verschiebung;
          kInit->OrthoXMin += Verschiebung;
          kInit->OrthoYMax -= Verschiebung;
          kInit->OrthoYMin += Verschiebung;
    

    That's Zoom.



  • Der Effekt ist nicht weiter verwunderlich.

    Ich geh exemplarisch mal davon aus, dass zDelta 1 (vor) bzw. -1 (zurück) ist.

    Dann sehen deine Zoom-Schritte bspw. folgendermaßen aus:

    1 2 3 4 5 6 ...

    beim zoom schritt von 1 auf 2 verdoppelt sich der zoom, während er bei 4 auf 5 nur um ein Viertel zunimmt.
    Wenn du einen gleichenmäßigen zoom in alle Richtungen haben willst, dann müssen deine Zoom schritte immer in der gleichen faktioriellen Abhängigkeit zueinander stehen
    also z.b. immer mal 2, immer verdoppeln
    1 2 4 8 16 32 64 ...

    In deinem Code, wenn meine Annahme von -1/1 zutrifft:
    zoom = zoom * (zDelta > 0 ? 2.f : 0.5.f) ;



  • Mit Potenzen funktionieren alle Schrittweiten.

    Bye, TGGC (Der Held bei Dir!)



  • Danke, das mit den Potenzen könnte es sein.

    Prinzipiell klappt das mit dem glScale()-Befehl ganz gut - ich entwickle ein Visualisierungs-Tool. Der Zoom an und für sich ist schon okay, nur das blöde Delay irritier mich. Könnte aber am von illuminator beschreibenen Effekt liegen. Danke schonmal. Werde das checken 🙂



  • Sapperlot!

    Auf Win98SE läuft es ohne Verzögerung, auf Win2000 hakt er wieder leicht?

    Wie kann das denn?


Anmelden zum Antworten