welche matrix für die perspektive?
-
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 heranwagenich 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
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 kommenVertexwahn 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 heranwagenhabe 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 somein 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?
-
leech: Setzen, 6!
Die Kommentare stimmen ja gar nicht mit den Codezeilen überein.Für Kreise gib´s auch was von Bresi

PS: Für deine glFrustrum Frage gibs von mir 3 Links frisch aus meiner Linksammlung:
-
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 Problemehab 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
