2d Koordinaten in 3d umrechnen

Übersicht Sonstiges Smalltalk

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

nilfor

Betreff: 2d Koordinaten in 3d umrechnen

BeitragSa, Dez 25, 2010 12:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 25, 2010 13:25
Antworten mit Zitat
Benutzer-Profile anzeigen
LinePick, PickedX/Y/Z Idea
Starfare: Worklog, Website (download)
 

nilfor

BeitragSa, Dez 25, 2010 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die schnelle antwort. Aber ich wollte wissen, wie die mathematik dahinter funktioniert.

Kernle 32DLL

BeitragSa, Dez 25, 2010 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 25, 2010 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 26, 2010 2:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

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

BeitragSo, Dez 26, 2010 3:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 11:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 12:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 12:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink . Wenn nich such ich nochmal woanders nach einer Lösung.

Vertex

BeitragMo, Dez 27, 2010 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 27, 2010 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group