2d Koordinaten in 3d umrechnen
Übersicht

nilforBetreff: 2d Koordinaten in 3d umrechnen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo zusammen und frohe Weihnachten.
Ich habe ein Dreieck im 3d-Raum gegeben (ax,ay,az,bx...) und einen Punkt in dem Dreieck (X,Y). Wie kann ich jetzt die 3d-Koordinaten des Punktes ausrechnen? nilfor |
||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
LinePick![]() ![]() ![]() |
||
Starfare: Worklog, Website (download) |
nilfor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die schnelle antwort. Aber ich wollte wissen, wie die mathematik dahinter funktioniert. | ||
![]() |
Kernle 32DLL |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich denke, du machst am besten einen Raycast vom Punkt Richtung Kamera. Wie einfach oder kompliziert das ist hängt davon ab mit was du in welcher Sprache programmierst. Wie ZaP schon sagte hat B3D da fertige Funktionen, Irrlicht hat da auch eine Funktion, und OpenGL meine ich da auch was gesehen zu haben (komme aber egrade nicht drauf wie die Befehle dafür hießen). Wenn es dir um die reine Mathematik geht bin ich leider der falsche Ansprechpartner. | ||
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog] Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89 Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009 |
nilfor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich versuche, eine eigene 3d-Engine in C++ zu schreiben. Ich bin fast fertig. Es fehlt nur noch ein Z-Buffer, für den ich die Entfernung zwischen einem Punkt und der "Kamera" brauche. Deshalb ist mir mit vorgefertigten Funktionen nicht geholfen. | ||
![]() |
Tornado11 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich verstehe zwar nicht ganz was du willst, doch ich denke das Problem läuft auf Vektorgeometrie raus ?
Du machst mit den drei Eckpunkten des Dreiecks eine Ebene und mit einer Geraden durch diese Ebene kannst du den Schnittpunkt berechnen... aber am besten formuliertst du deine frage nochmal, ich habs nämlich leider nicht ganz verstanden ![]() Edit: Die Kamera hat die Position(x1|y1|z1) Der Punkt (x2|y2|z2) Die distanz ist: wurzel von ((x1-x2)^2+(y1-y2)^2+(z1-z2)^2) |
||
HavockToxx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nilfor hat Folgendes geschrieben: Ich versuche, eine eigene 3d-Engine in C++ zu schreiben. Ich bin fast fertig.
Fast fertig ist man nie mit einer Engine!! Höstens Einsatzfähig. Es seiden du hattes von Anfang an keine hohe Erwartungen gestellt. Aber mal eine Frage an dich: Warum eine 2D Koordinate in 3D Umrechnen wenn man eine 3D Engine plant???? Ich vermute mal, du Versuchst eine Gui (Graphics User Interface) für deine 3D Engine zu schreiben. Oder 2D Funktionen in deiner 3D Engine ein zubauen. Bedenke folgendes dabei. Alles was n 3D Engine kann, sind 3D auf ein 2D Monitor Umwandeln zu können. Wenn man weiß, wie sowas von statten geht, kann man auch deine Probleme schnell lösen. Es kann auch nicht schaden, ein paar Bücher zu lesen zu diesen Thema gibs zwar einige Bücher in Englisch, dafür sehr gute. Auch das Studieren von alten 3D Engines die teilweise mit SourceCode gibt, kann viel helfen. Lerning by Doing ist zwar nicht verkert aber ohne Grundwissen kommt man beim Programmieren einer 3D Engine nicht weit. MFG Havock |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
X,Y auf den Dreieck = Koordinaten auf einer Ebene. Hat die Ebene eine Rechtwinkliges Koordinatensystem?
Wo ist der Punkt 0/0 auf der Ebene, wo dein Dreieck drauf liegt? |
||
between angels and insects |
![]() |
Jo0oker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Aber mal eine Frage an dich: Warum eine 2D Koordinate in 3D Umrechnen wenn man eine 3D Engine plant???? Weil man sowas verdammt oft als Entwickler braucht? Zum Beispiel wenn du Objekte (3D) mit der Maus (2D) auswählen möchtest. Zitat: Alles was n 3D Engine kann, sind 3D auf ein 2D Monitor Umwandeln zu können. Bist du dir da sicher? lg Jo0oker |
||
Tehadon, das kostenlose 3D RPG
www.tehadon.de http://www.blitzforum.de/worklogs/14/ Das Abenteuer wird beginnen! |
HavockToxx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jooocker: Da bin ich mir sehr sicher. Die Hauptaufgabe einer 3D Engine ist es halt 3D Koordinaten auf den 2D Monitor zu bringen. Dabei wird eine Umwandlung der Koordinaten von statten. Das macht nicht deine Grafikkarte. Die macht nur eins. Die Empfangenden Daten an den Monitor weiter zu geben und sich für den Empfang neue Daten bereitstellen.
MFG Havock |
||
![]() |
Lord Stweccys |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dem kann ich mich nicht anschließen. Wozu braucht denn eine Grafikkarte sonst einen eigenen Prozessor,
wenn die CPU das meiste Gesums rechnet? Sie dir mal OpenGL an. Ich glaube nicht, dass OpenGL die Koordinaten umrechnet, lediglich die GPU der Grafikkarte, die OpenGL-kompatibel ist, auffordert die Befehle auszuführen. -> Es gibt die Befehle nur an die GraKa weiter. |
||
- Zuletzt bearbeitet von Lord Stweccys am Mo, Dez 27, 2010 12:34, insgesamt einmal bearbeitet
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da muss ich dir, HavockToxx, widersprechen!
In OpenGL zeichnet man im dreidimensionalen Raum; die Grafikkarte berechnet die 2D-Bilder dann mit Hilfe der gegebenen Projektionsmatrizen. (Die hat auch eine Menge anderer Sachen zu tun.) In Direct3D wird das ähnlich sein. Die Hauptaufgabe einer 3D-Engine ist eher die Verwaltung der Objekte, Modelle, Texturen, Lichter etc. pp. mfG mpmxyz Edit: Wo hast du bitte gelesen, dass ich hier geschrieben habe, dass OpenGL eine 3D-Engine wäre? |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
- Zuletzt bearbeitet von mpmxyz am Mo, Dez 27, 2010 13:16, insgesamt einmal bearbeitet
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Noch eine Frage, wie ist die Skalierung des Koordinatensystemes auf dem Dreieck?
wenn du die Fragen beantwortest, dann kann ich dir die Lösung geben. |
||
between angels and insects |
![]() |
Jo0oker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eben, eine Grafik-Engine macht viel mehr als nur das Rendern der 3D Grafiken. Dafür ist nämlich nur ein Teil verantwortlich, die Renderpipline, welche wiederum in den meisten fällen DX oder OGL zur verfügung stellt.
lg Jo0oker |
||
Tehadon, das kostenlose 3D RPG
www.tehadon.de http://www.blitzforum.de/worklogs/14/ Das Abenteuer wird beginnen! |
HavockToxx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
mpmxyz hat Folgendes geschrieben: Da muss ich dir, HavockToxx, widersprechen!
In OpenGL zeichnet man im dreidimensionalen Raum; die Grafikkarte berechnet die 2D-Bilder dann mit Hilfe der gegebenen Projektionsmatrizen. (Die hat auch eine Menge anderer Sachen zu tun.) In Direct3D wird das ähnlich sein. Die Hauptaufgabe einer 3D-Engine ist eher die Verwaltung der Objekte, Modelle, Texturen, Lichter etc. pp. mfG mpmxyz Das ist Blödsin. OpenGL und DirectX sind KEINE 3D Engine sondern eine Funktionale Bibliotek. Das ein gewaltiger Unterschied. Und wenn man auch deren SDKs grade bei OpenGL sich näher anguckt, weis wie diese Matrizen berechnet werden. Sollte OpenGL oder DirectX eine 3D Engine sein, müssten alle Bücher die das Programmieren von Spielen predigen, umgeschrieben werden müssen. MFG Havock |
||
klepto2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. Hat hier niemand behauptet, das OpenGL und Direct3D Grafik-Engines sind.
Um genauzusein sind OpenGL und Direct3D (wohlgemerkt nicht DirectX) Schnittstellen zur kommunikation zwischen den Treibern der Grafikkarte und der Software. 2. Berechnen Grafikkarten wie ein 3D Punkt auf einem 2D Bildschirm auszusehen haben. Man schickt einen unberechneten 3D/2D Punkt an die Grafikkarte und die berechnet anhand vorher an sie übertragenen Matrizen (ModelView, Projection etc) den korrekten Wert des Punktes an der bildschirmkoordinate. 3. 3DEngines dienen wie vorher schonmal erwähnt hauptsächlich zur Verwaltung der Objekte (in B3D zb Entities) ebenso werden durch eine 3DEngine die Materialien und Texturen verwaltet. Selbst das Culling kompletter Objekte wird auf der CPU berechnet, damit man Bandbreite spart. Erst das feine culling (Backfaceculling) findet auf der GPU statt (außer man beutzt zb Occlusion Queries etc.). 4. Wenn zu einer Engine noch andere Sachen wie Physik oder Scripting hinzukommt spricht man eigentlich nicht mehr von einer 3D-Engine sondern von einer Game-Engine. Ogre3D ist zb eine reine 3D-Engine, Mit den ganzen Addons wird aus Ogre3D erst eine GameEngine. mfg klepto2 |
||
Matrix Screensaver
Console Modul für BlitzMax KLPacker Modul für BlitzMax HomePage : http://www.brsoftware.de.vu |
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jetzt hört doch mal auf mit OT!
Frage: Gegeben: Dreieck in der Gleichung V1,V2,V3 in Form: X/Y/Z Position auf dem Dreieck in X/Y Gesucht: Punkt auf Dreieck in Form: X/Y/Z Meine Fragen dazu: Wie ist X/Y auf dem Dreieck? |
||
between angels and insects |
nilfor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So, gerade erst von den Verwandten wiedergekommen. Danke für die vielen Antworten.
Mein Ziel ist es, einen Würfel darzustellen. Den Würfel lasse ich aus einzelnen Dreiecken darstellen. Damit die hinteren Dreiecke nicht über die Vorderen gezeichnet werden, muss ich speichern, wie weit die Entfernung der gezeichneten Punkte von der Kamera ist. Dazu brauche ich die X, Y, Z-Koordinate des Punktes. Wenn ich die drei Werte habe kann ich den Rest einfach mit Pythagoras rechnen. Bekannt sind mir folgende Werte: X,Y,Z Positionen der Dreiecke des Würfels, X,Y Position des Gezeichneten Pixels auf dem Bildschirm und die Koordinaten der Kamera sind alle 0. Ich hoffe das reicht aus um mir zuhelfen ![]() |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aus der OpenGL Utility Library gibt es die Funktion gluUnProject, die Fenster-Koordinaten in Objektkoordinaten rückprojeziert.
Das Argument für den winZ-Parameter ist aus dem Z-Buffer zu entnehmen. Damit vernünftige Objektkoordianten berechnet werden können, muss also an dieser Stelle bereits ein Polygon gezeichnet worden sein, dass den Z-Buffer gefüllt hat. Ciao Olli |
||
vertex.dreamfall.at | GitHub |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir fällt eine einem Raytracer ähnelnde Lösung ein:
Dann berechnet man einfach den Schnittpunkt zwischen einer Gerade, dem "Sehstrahl", und der von dem Dreieck gebildeten Ebene. Ich nehme jetzt an, dass die Richtungen der x/y-Achsen des dreidimensionalen Koordinatensystems mit denen des Bildschirms übereinstimmen. Bei der z-Koordinate gibt es einen Wert z1, der dafür sorgt, dass die Größen 1 zu 1 erhalten werden. (nähere z-Werte: Das Dreieck wird größer gezeichnet. entferntere z-Werte: Es erscheint kleiner.) Die Sehgerade lässt sich nun so beschreiben: G(t):=(x,y,z1)*t Die Ebene lässt sich über diese Funktion definieren: E(r,s):=V1+(V2-V1)*r+(V3-V1)*s Nun muss man beide Funktionen gleichsetzen und den Wert t berechen. (V2-V1)*r+(V3-V1)*s+(-x,-y,-z1)*t=V1 Diesen setzt man in G(t) ein. Das Ergebnis ist die 3D-Position des Punktes im Dreieck. Wenn noch nicht klar ist, ob der Punkt im Dreieck liegt, kann man die Parameter r und s berechnen und auf diese Bedingungen prüfen: Code: [AUSKLAPPEN] r>=0
s>=0 r+s<=1 Wenn alle erfüllt sind, liegt der Punkt im Dreieck. mfG mpmxyz PS: Die verwendete Mathematik ist Stoff aus der 12. Klasse. Stelle notfalls Fragen! |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group