welche matrix für die perspektive?



  • hi,

    ich kann nun schon 3d objekte auf den bildschirm zaubern...
    ich bearbeite auch die eingaben des benutzers.. wenn man nun zum beispiel die pfeiltaste nach oben drückt, dann soll das objekt größer werden (man zoomt ja rein) und beim drücken der pfeiltaste nach unten soll man herauszoomen...

    doch das funktioniert nicht so ganz... nun habe ich ein bisschen rumgesucht und bin auch folgende matrizen gestoßen:

    glOrtho(...) und glFrustum(...)

    welche sollte man davon nehmen, oder spielt das keine rolle?

    p.s.: das kommt doch nach dem setzen der projektionsmatrix, oder?
    also so z.Bsp:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(...);
    

    ncoh eine frage: was bringt der viewport und wofür braucht man den?



  • Statdessen die Projektionsmatrix zu ändern, ändere doch die Position deiner 3D-Objekte (bzw. die deiner Kamera). Willst das Objekt ranzoomen, dann lass das Objekt sich in Richtung deiner Kamera bewegen.



  • Gibt's eigentlich keine Doku für OGL?

    Bye, TGGC (Wähle deine Helden)



  • TGGC schrieb:

    Gibt's eigentlich keine Doku für OGL?

    Doch, die ist aber, nach DX Maßstäben geurteilt, Müll.


  • Mod

    TGGC schrieb:

    Gibt's eigentlich keine Doku für OGL?

    lern googlen, dann findest du sowas selbst

    http://www.opengl.org/documentation/blue_book_1.0/

    rapso->greets();



  • BigBoomer schrieb:

    Statdessen die Projektionsmatrix zu ändern, ändere doch die Position deiner 3D-Objekte (bzw. die deiner Kamera). Willst das Objekt ranzoomen, dann lass das Objekt sich in Richtung deiner Kamera bewegen.

    das ist ja das problem... wenn ich die z-koordinate verändere ändert sich nichts am bild... es bleibt gleich groß, bis es irgendwann verschwindet... das wundert mich eben...



  • Also du musst schon den Weg über glFrustum gehen, denn mit
    glOrtho hast du eine Parallelperspektive.



  • bevor du irgendetwas programmierst solltest du dir unbedingt mal folgende Seite durchlesen:

    http://www.devmaster.net/articles/software-rendering/part2.php

    und den unterschied zwischen parallel und zentral projektion verstehen

    außerdem solltest du wissen wie man mit Matrizen rechnet - ist die absolute Grundlage für jemanden der 3D zeug programmieren will

    sinnvoll wäre es sicherlich auch wenn du dich erst mit 2D problemen beschäftigene würdest - wie dem zeichnen eines Geradenstücks 😉 - erst dann solltest du dich an die 3d welt heranwagen

    ich war auch mal jung 😉 und hab gedacht wenn ich DrawPrimitve aufrufen kann dann bin ich ein 3D Programmierer - das ist aber leider nicht so



  • rapso schrieb:

    TGGC schrieb:

    Gibt's eigentlich keine Doku für OGL?

    lern googlen, dann findest du sowas selbst

    http://www.opengl.org/documentation/blue_book_1.0/

    Gut zu wissen, sollte man sich notieren.

    Bye, TGGC (Wähle deine Helden)



  • Vertexwahn schrieb:

    bevor du irgendetwas programmierst solltest du dir unbedingt mal folgende Seite durchlesen:

    http://www.devmaster.net/articles/software-rendering/part2.php

    und den unterschied zwischen parallel und zentral projektion verstehen

    okay... habe ich gelesen und es hat mir geholfen.. nun weiß ich, dass ich eine
    zentrale projektion haben möchte -> also: glFrustum(...);

    Vertexwahn schrieb:

    außerdem solltest du wissen wie man mit Matrizen rechnet - ist die absolute Grundlage für jemanden der 3D zeug programmieren will

    dies weiß ich auch so einigermaßen... das schwere ist ja nur matrizen zu multiplizieren...
    dann muss man halt diese langen terme ausrechnen, um dann auf den wert zu kommen

    Vertexwahn schrieb:

    sinnvoll wäre es sicherlich auch wenn du dich erst mit 2D problemen beschäftigene würdest - wie dem zeichnen eines Geradenstücks 😉 - erst dann solltest du dich an die 3d welt heranwagen

    habe schon mit der SDL ein paar sachen gemacht und muss sagen, dass dies nicht sonderlich schwer war... 2d ist ja auch nicht das problem...

    Vertexwahn schrieb:

    ich war auch mal jung 😉 und hab gedacht wenn ich DrawPrimitve aufrufen kann dann bin ich ein 3D Programmierer - das ist aber leider nicht so

    mein einziges problem ist nun wirklich nur noch, dass ich nicht weiß, was man genau als parameter von glFrustum(...) angeben soll, da man ja normalerweise einen winkel, das breiten/ höhenverhältnis und dann die nahe und die ferne clipping ebene angibt...



  • habe schon mit der SDL ein paar sachen gemacht und muss sagen, dass dies nicht sonderlich schwer war

    ich finde halt nur das leute die nicht mal eine Geradenstück rastern können nicht 3D grafik programmieren sollten, sondern sich erst etwas mit den Grundlagen beschäftigen sollten

    kannst du ein Geradestück rastern? 😉

    versuch mal eine Funktion DrawLine(int x1, int y1, int x2, int y2) zu programmieren - dann reden wir weiter 😉



  • Am besten gleich mit AA .. tt



  • das hier wäre mein vorschlag eine gerade zu zeichnen in 2d...
    einen kreis würde ich dann mit der kreisgleichung berechnen und malen...

    //mit allegro realisiert...
    void drawLine(int x1, int y1, int x2, int y2)     
    {
    	acquire_screen();      //zuerst die steigung berechnen...
    	float m = float((y2 - y1) / (x2 - x1));		  //es wird nicht geprüft, ob x2 - x1 == 0 ist... sollte ja nur meinen überlegungsansatz zeigen...		
    	float b = y1 - (m * x1);	  //dann den y-achsenabschnitt...
    	if(x1 < x2)
    	{
    		while(x1 < x2)							 
    		{
    			int x = x1 + 1;      //der eine punkt nähert sich dem anderen...
    			int y = int(m * x + b);         //den y- wert der x-koordinate berechnen...                     
    			putpixel(screen, x, y, makecol(255, 0, 0));    //den punkt anzeigen...
    			x1++;
    		}
    	}
    	else
    	{
    		while(x1 > x2)			   			
    		{
    			int x = x1 - 1;        //gleiches verfahren, nur anders herum...
    			int y = int(m * x + b);
    			putpixel(screen, x, y, makecol(255, 0, 0)); 
    			x1--;
    		}	
    	}	
    	release_screen();
    }
    

    @ life.. die theorie habe ich mir ja schon ein bisschen angeeignet (habe das buch von scherfgen angefangen...).... mein problem ist es, dass ich nur die parameter der funktion glFrustum(...) erklärt haben möchte... habe schon gesucht, aber keine genaue antwort auf meine frage gefunden.. welche parameter müsste man z. Bsp angeben, wenn man einen blickwinkel von 90° haben möchte?





  • http://turing.fh-landshut.de/~jamann/gerade.JPG

    wie du siehst funktioniert dein algo noch nicht so toll 😉
    abgesehen das er keinen Punkt und eine Vertikale zeichnen kann hat er noch mit bestimmten Steigungen Probleme

    hab mit folgende werten getestet:
    drawLine(10, 10, 200, 100);
    drawLine(10, 100, 200, 90);
    drawLine(20, 20, 100, 240);
    drawLine(5, 230, 8, 10);
    // Punkt
    //drawLine(2, 2, 2, 2);

    // Waagrechte\Horizontal
    drawLine(30, 50, 240, 50);
    // Vertikale
    //drawLine(200, 180, 200, 0);

    drawLine(111, 11, 100, 200);
    drawLine(200, 11, 0, 100);
    drawLine(200, 200, 0, 150);
    drawLine(200, 200, 180, 0);



  • leech schrieb:

    das hier wäre mein vorschlag eine gerade zu zeichnen in 2d...
    einen kreis würde ich dann mit der kreisgleichung berechnen und malen...

    //mit allegro realisiert...
    void drawLine(int x1, int y1, int x2, int y2)     
    {
    	acquire_screen();      //zuerst die steigung berechnen...
    	float m = float((y2 - y1) / (x2 - x1));		  //es wird nicht geprüft, ob x2 - x1 == 0 ist... sollte ja nur meinen überlegungsansatz zeigen...		
    	float b = y1 - (m * x1);	  //dann den y-achsenabschnitt...
    	if(x1 < x2)
    	{
    		while(x1 < x2)							 
    		{
    			int x = x1 + 1;      //der eine punkt nähert sich dem anderen...
    			int y = int(m * x + b);         //den y- wert der x-koordinate berechnen...                     
    			putpixel(screen, x, y, makecol(255, 0, 0));    //den punkt anzeigen...
    			x1++;
    		}
    	}
    	else
    	{
    		while(x1 > x2)			   			
    		{
    			int x = x1 - 1;        //gleiches verfahren, nur anders herum...
    			int y = int(m * x + b);
    			putpixel(screen, x, y, makecol(255, 0, 0)); 
    			x1--;
    		}	
    	}	
    	release_screen();
    }
    

    😮 😮 😮

    ungetestet:

    void drawLine(int startX, int startY, int endX, int endY)
    {
       acquire_screen();      
       for(float iteratorX = (abs(endY - startY) < abs(endX - startX))?((endX-startX<0)?-1:1):((float)(endX-startX)/(float)(abs(endY-startY))),iteratorY = (abs(endY - startY) < abs(endX - startX))?((float)(endY-startY)/(float)(abs(endX-startX))):((endY - startY < 0)?-1:1),iX = startX,iY = startY,aaX = abs(endY - startY) < abs(endX - startX)?0:1,aaY = abs(endY - startY) < abs(endX - startX)?1:0,i=0,color=0;i <= ((abs(endX-startX)>abs(endY-startY))?abs(endX-startX):abs(endY-startY));++i,iX += iteratorX,iY += iteratorY)
       {
           putpixel(screen,(int)iX,(int)iY, makecol((int)(color =(int)(255.0f * pow(1.0f - abs((float)iX - (int) iX) - abs((float)iY - (int) iY),(aaY!=0)?0.3f:0.5f))),(int)color,(int)color));
    	   putpixel(screen,(int)iX+(int)aaX, (int) iY + (int)aaY, makecol((int)(color = (int) (255.0f * pow(abs( (float) iY - (int) iY)+abs((float)iX - (int) iX),(aaY!=0)?0.3f:0.5f))), (int)color, (int)color));
       }
       release_screen();
    }
    

    🤡

    btw.: für schwarzen hintergrund optimiert 😉


Anmelden zum Antworten