Zoomen



  • hallo,
    suche einen einfachen Weg, um Punkte auf einer 2D Karte heran zu zoomen. Hat jemand ein Beispiel oder nen Tip?
    Danke schön



  • D3D verwenden und den FOV verändern 😉



  • echtzeit oder qualität?



  • Wenn Du DirectX Graphics (DirectX 9) verwendest, oder OpenGL, kannst Du im Prinzip gleich, wie "interpreter" bereits sagte, ein 3D-Objekt nehmen und dieses zoomen. Z.B. indem Du die Karte als Textur definierst, und auf 2 Dreiecke verteilst (als Rechteck). Mit DirectX Graphics hat man noch die Moeglichkeit, Billboard-Sprites zu definieren, und diese zu zoomen.

    Bei einem reinen 2D API gibt es oft auch die Moeglichkeit, zu zoomen. Beim Windows GDI z.B. ueber StretchBlt(). Ggf. kann es sich lohnen, eine eigene Zoomroutine zu schreiben, fuer den jeweiligen 2D API. (z.B. fuer DirectX 1 bis 8, SDL oder GDI). In der Regel aber haben heutige Grafikkarten hardwaremaessiges Zoomen ueber die 3D APIs praktisch eingebaut, was so gut wie immer schneller ist, als selbstgeschriebene Routinen. Aber dafuer muss das Programm dann einen 3D API benutzen (also z.B. OpenGL oder DirectX Graphics bzw. Direct3D).



  • zoomen ist nix anderes als skalieren. dazu multipliziert man einfach jeden punkt mit dem gewünschten skalierungsfaktor ( > 1 = zoom in, < 1 = zoom out ).

    das problem dabei ist, dass sich die objekte um den ursprung herum skalieren. liegt dieser nicht in der mitte des viewports (des ausschnitts, den man gerade sieht), so "wandern" die punkte beim zoom nicht vom zentrum nach aussen, sondern beispielsweise nach rechts aus dem bild raus.

    um diesem entgegenzuwirken, muss man die relative änderung des darzustellenden ausschnitts zum viewport berechnen.

    ich empfinde es als leicht zugänglich, wenn man den weg ein wenig andersherum beschreitet. man betrachtet, welchen ausschnitt des zugrundeliegenden koordinatensystems auf dem viewport gerade dargestellt wird (bspw. [-3.0:3.0][-2.0:3.0]), "zoomt" diesen in relation zum viewport (bspw. grosse 640x480) und lässt dann anschliessend die entsprechenden punkte für den neuen ausschnitt darstellen.

    man kann natürlich auch eine projektionsmatrix hernehmen, eine dritte dimension einfügen, auf welcher die projektionsfläche steht und entsprechend den abstand der "kamera" zu dieser ändern.
    das funktioniert allerdings bei orthogonaler projektion nicht viel anders als oben beschrieben. perspektivische wäre in dem fall einfacher, ist auch das was direct3d und konsorten machen (denk ich mal ;)), hat aber den "nachteil" der perspektivischen projektion. die punkte werden zum bildrand hin immer näher beeinander liegen.



  • Vertexwahn schrieb:

    echtzeit oder qualität?

    IMHO gute Frage.

    Bye, TGGC (Dem beste BdT)



  • Ist zwar schon ein älteres Thema und es behandelt nich meine Fragestellung, aber der Titel passt zu meiner Frage, daher wollte ich keinen neuen Thread aufmachen.

    Aber Achtung! Ist trivial (ich raff´s nur nicht!)

    Also folgendes:
    Ich hab eine Particle Engine nachgebaut (nach einem NEHE-Tutorial) und etwas erweitert. Jetzt will ich in die Szene zoomen und dachte, dass man dafür ja nur for die Render-Aufrufe ein glTranslatef(0,0,zoom) setzen müsste.
    Die z-Werte werden auch geändert, aber es scheint als würde die Szene einfach weggeclippt werden.

    void Display::paintGL()
    {	
    	glClear(GL_COLOR_BUFFER_BIT);// | GL_DEPTH_BUFFER_BIT);
    	glMatrixMode(GL_PROJECTION);
    
    	glLoadIdentity();
    
    	glTranslatef(xView, yView, zView);
    	glPushMatrix();
    		renderScene();
    	glPopMatrix();
    }
    
    void Display::resizeGL(int width, int height)
    {	
    	glViewport(0, 0, width, height);
    	glOrtho(-50, 50, -50, 50, -51, 51);
    	//glMatrixMode(GL_PROJECTION);
    	//gluPerspective(500, width / height, -51, 51);
    	//glMatrixMode(GL_MODELVIEW);
    	//glLoadIdentity();
    }
    

    Hab schon mehrere Sachen versucht, aber ich blick einfach nicht durch.
    Ist an obigem Code schon was falsch, oder kann der Fehler an anderer Stelle liegen?

    Vielen Dank
    mtx



  • Die z-Werte werden auch geändert, aber es scheint als würde die Szene einfach weggeclippt werden.

    Skalieren! glScale()



  • oh man und ich sag noch, dass es trivial ist... *omg*
    Danke!

    Aber kann mir auch jemand erklären, warum die Änderung der z-Koorinaten nix bringt?



  • mtx schrieb:

    Jetzt will ich in die Szene zoomen und dachte...

    Beim "Zoom" aendert man nicht die Kameraposition!
    Stattdessen willst Du:

    interpreter schrieb:

    den FOV verändern

    Siehe gluPerspective.

    mtx schrieb:

    kann mir auch jemand erklären, warum die Änderung der z-Koorinaten nix bringt?

    Weil Du orthographisch projezierst.



  • o.k. das leuchtet ein. Mit gluPerspektive hab ich auch rumgespielt (wie man sieht), aber das hat mich auch nicht zum Ziel geführt.


Anmelden zum Antworten