Registriert: So Jan 23, 2005 13:21 Beiträge: 46 Wohnort: Vietnam
Hat jemand von euch schon eine eigene 3D-Engine programmiert? Eine sehr einfache? Also nur so, das er einen 3D Punkt in 2D darstellen kann?
Will mir nämlich mal den Quellcode dazu anschauen. Wollte selber mal ne Engine machen, aber irgendwie fehlte mir der oben genannte Punkt. Drehen, skaliere, etc ging alles perfekt, nur 3D wars nicht. Wenn vielleicht jemand den code posten könnte oder die File schicken, das wäre nett.
_________________ "As the enemy went to heaven,
we stayed in hell!"
Registriert: So Jan 23, 2005 13:21 Beiträge: 46 Wohnort: Vietnam
Es ist sozusagen eine 3D-Engine.
Man hat einen Punkt mir 3 Koordinaten (x,y,z). Der Bildschirm ist aber eine 2D-Fläche, deswegen muss der Punkt ja auf 2D (x,y) umgerechnent werden. Sowas möchte ich machen.
_________________ "As the enemy went to heaven,
we stayed in hell!"
OpenGL gibt das doch von alleine so aus :-/
Versteh dein Problem net.
Wenn du das machen willst, damit du testen kannst ob deine Maus darauf zeigt, da gibts andere möglichkeiten.
Lade dir mal das OpenGL Template von der Seite hier. Da ist ein drehendes Dreieck und alles was man machen muß ist die Koordinaten in 3D und die Drehwinkel richtig anzugeben. Das ganze Zeichnen erledigt ja die Grafikkarte.
Registriert: So Jan 23, 2005 13:21 Beiträge: 46 Wohnort: Vietnam
Das Thema wird ein bisschen falsch verstanden. Wenn es um OpenGL geht, dann würd ich mir die Sachen einfach downloaden bzw. hätte ich eine andere Rubrik genommen. Genau, was die Grafikkarte macht, möchte ich machen. Ich gebe hier mal ein Beispiel dazu.
Das Beispiel sieht schon richtig aus, aber ist es doch noch nicht. Da, wenn man die Position des Würfels verändert, der Würfel zu einem Rechteck wird.
Beschreibung:
Mit dem Numpadstasten kann man den Würfel drehen und mit der rechten Pfeiltaste wird der Würfel nach rechts geschoben. Beim Verschieben funktioniert meine Formel nicht, deswegen brauch ich eine Richtige (heisst glaube ich Projektionsmatrix).
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
_________________ "As the enemy went to heaven,
we stayed in hell!"
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ahhhh du möchtest die Mathematik dahinter? Gut. Guck mal unter Links -> General -> CompGeo. Dieses Script is von meiner Uni. Dort wurde ganau das behandelt. Da du anscheinend etwas ahnung von Mathe hast, kannst du sicherlich mit der Erklärung und den Matrizen aus dem Script umgehen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: So Jan 23, 2005 13:21 Beiträge: 46 Wohnort: Vietnam
Bei mir funktioniert das nicht. Nachdem ich einige Weile das ausprobiert und herumgebastelt habe, funktionierte das aber nie. Hab auch ein bisschen selbst versucht, ein bisschen zu verändern, aber hat auch nicht geklappt
_________________ "As the enemy went to heaven,
we stayed in hell!"
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Was genau geht denn nicht. Es gibt hier einige die bisl Ahnung von mathe haben (ich nicht ) eventuell können die dir helfen. Dafür musst du aber mehr Infos geben.
Wie siehts aus, wie solls aussehen, wie machst du's, welche Möglichkeiten hast du schon probiert, etc.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Mi Aug 28, 2002 19:27 Beiträge: 568 Wohnort: Chemnitz / Sachsen
tja da musste mal in kunst aufpassen ... hab das mal vor 3-4 jahren in pascal gemacht, ne einfache fluchtpunktgrafik .... leider halt nur mit linien, keine flächen ...
Registriert: Mo Feb 24, 2003 18:19 Beiträge: 165 Wohnort: Cologne
einen fluchtpunkt zu nehmen ist nicht zwingend notwendig...
ich weiss nicht wie es "richtig" gemacht wird, aber mein versuch zu meinen tp zeiten sah ungefähr so aus:
Code:
x_2d := Round ( x * z * 160);
y_2d := Round ( y * z * 100);
wobei 160 bzw 100 die hälfte von bildschirmbreite/höhe ist, x,y und z sind gleitkomma... (zu faul für integer-only)
dann kannst du sehr einfach "3d"-linien zeichnen, und mit ein bisschen mathe auch gefüllte dreiecke... zum schluss nur noch die polygone nach z sortieren und zeichnen, fertig.
wie gesagt, weiss nicht ob das eine so gute methode ist.. ist auch ein wenig ungeschickt mit dem z, ich glaube irgendwo hab ich noch einen workarround, aber den hab ich nich mehr im kopf. wenn du willst kann ich ja mal nach meinen alten sources schauen
Registriert: Di Dez 02, 2003 12:47 Beiträge: 300 Wohnort: Marburg
Also ich darf hier auch mal meine Auswürfe loswerden:
Ich würde da so rangehen:
Die Kamera ist durch nen Vektorbasis repräsentieren, verankert durch eine Stützvektor. (Vektoren der Basis haben alle länge=1 und sind Alle parweise senkrecht)
Dann subtrahiert du von jedem Punkt den Stützvektor (Position der Kamera).
Dann transformiert du den Punkt in die Basis. (Oder du erstellst die invertierte Basis und multiplizierst mit dem Punkt)
Dann kannst dir einfach den Tangenz des Winkels des neuen Punktes (den in die Basis transformierten) zur X/Z und zur Y/Z Ebene ausrechnen über gegen durch ankathete (also X/Z-Wehrt und Y/Z-Wehrt).
Und dann sagst du der Bildschirm geht von tan=-0,5 bis tan=0,5 oder so (jeh nach erwünschtem Sichtwinkel) und rechnest in Bildschirmcoordinaten um.
Müsste so oder so ähnlich gehen... Obs noch viel einfacher geht weiß ich nicht.
P.s. Wenn ich Zeit habe, kann ichs gerne noch mal ausführlich ausführen, einfach melden.
_________________ Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de
Prinzipiell brauchst du:
* einen Vektortyp (3D oder 4D) =: V
* einen Matrixtyp (4D) =: M
* Routinen zum berechnen von M*M->M und V*M->V
Sämtliche einfachen 3D-Transformationen (verschieben, rotieren, skalieren) können als Matrizen ausgedrückt werden, die noch dazu zusammenmultipliziert werden können, sodass für die endgültige zusammengesetzte Transformation wiederum eine Matrix verwendet wird (was ja auch der Vorteil des Ganzen ist: man kann beliebig viele grundlegende Transformationen in einer einzigen Matrixmultiplikation zusammenfassen). OpenGL nennt diese Matrix die ModelView Matrix (und diese ist, so nur einfache Transformationen zusammengesetzt wurden, auch immer invertierbar).
Um nun die berechneten 3D-Punkte (in "Welt"-Koordinaten) auf den Bildschirm zu bringen, muss man sie sozusagen auf eine Ebene (den Bildschirm) projizieren. Auch diese Operation (im Trivialfall werden x und y mit einer Konstante multipliziert, anschließend durch z dividiert - der Nullpunkt des 2D-Koordinatensystems auf deinem Bildschirm ist somit logischerweise gleichzeitig der vorher genannte Fluchtpunkt) lässt sich in einer 4x4 Matrix darstellen (und sich zu den vorher genannten Operationen dazumultiplizieren). OpenGL nennt diese Matrix die Projektionsmatrix.
OpenGL unterstützt sowohl perspektive als auch orthogonale Projektionen, im Prinzip kann man aber in die entsprechende Matrix auch selbst reinschreiben was man will (oder ganz darauf verzichten und alles mit der ModelView Matrix machen, oder sämtliche Punkte "händisch" irgendwie transformieren und sowohl auf ModelView und Projektionsmatrix verzichten, d.h. diese Matrizen auf den Einheitsmatrizen belassen).
Schlussendlich kannst du natürlich auch ganz auf OpenGL verzichten, was du ohnehin tun musst, wenn du etwa eine Softwareengine schreibst - Lars hat z.B. unlängst ein entsprechendes Java Projekt präsentiert.
Mehr steckt nicht dahinter (bei der Verwendung von 4D-Vektoren kann man noch einige spezielle Sachen machen - etwa "unendlich lange" Schatten generieren) - die genauen Formeln sind meines Wissens sogar im Red Book angegeben - ansonsten findest du sie in jedem halbwegs brauchbaren Buch über 3D Grafik und/oder lineare Algebra.
Registriert: Mi Aug 28, 2002 17:03 Beiträge: 37 Wohnort: ABG
Hi!
Ich habe mal eine Wireframe Engine geschrieben. Leider hatte ich damals noch nicht die große Ahnung, wie das ganze richtig abläuft. Jedoch verwende ich schon Matrizen und Vektoren zur berechnung:
http://blitzforum.de/viewtopic.php?t=7078 Ich hoffe du kannst etwas damit anfangen.
mfg olli
_________________ Programmieren beginnt im Kopf und endet im Compiler
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.