Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem: Punkte im 3D Raum auf 2D Ebene übertragen
darkdester - Mo 22.09.08 14:33
Titel: Problem: Punkte im 3D Raum auf 2D Ebene übertragen
Hiho
folgendes Prob:
hab mir ein Koordinatensystem(XYZ) zeichnen lassen mit canvas. Gezeichnet wird ja über X und Y... sprich Höhe und Breite.
Das Problem ist jetzt wenn ich mit Vektoren rechne oder Punkte im 3D raum habe muss ich diese mit ihren 3D Punkten irgendwie in 2D umwandeln. Sprich ich muss XYZ mit XY zeichnen.
Hat jemand ne Idee wie ich das einfach lösen könnte? Möchte nicht erst in OpenGL nen 3D Raum coden müssen.
danke im Vorraus
mfg
darkdester
AXMD - Mo 22.09.08 14:37
Das Stichwort lautet Projektion.
AXMD
darkdester - Mo 22.09.08 14:41
ja I know aber
a) hab ich versucht mich da schlau zu machen aber es ist gescheitert
b) haben 2 Freunde (beide Mathestudenten) versucht mein Problem zu lösen und sind auch gescheitert *g*
desweiteren ist ne hilfreiche Antwort nicht nur 1 Wort ;)
AXMD - Mo 22.09.08 14:44
darkdester hat folgendes geschrieben: |
a) hab ich versucht mich da schlau zu machen aber es ist gescheitert |
Woran ist es gescheitert? Wenn du uns nicht sagst, wo genau das Problem liegt, wird dir niemand helfen können.
darkdester hat folgendes geschrieben: |
desweiteren ist ne hilfreiche Antwort nicht nur 1 Wort ;) |
Du hattest nicht gesagt, dass du bereits nach Projektion gesucht hast; demnach wäre das der erste Ansatzpunkt gewesen.
AXMD
OT:
darkdester hat folgendes geschrieben: |
b) haben 2 Freunde (beide Mathestudenten) versucht mein Problem zu lösen und sind auch gescheitert *g* |
Nun, dann sollten sie vielleicht besser Botanik studieren :lol:
darkdester - Mo 22.09.08 14:47
das problem ist das ich nicht weiß wie ich z(3te Raumkoordinate) verrechnen soll
die anderen probleme fallen mir grad nicht ein *g* aber das war jedenfalls das hauptproblem
ace1905 - Mo 22.09.08 15:04
hi
also nehmen wir mal an jede deiner einheiten auf der x2 und x3 achse sind 50 pixel groß...
da ja die x1 achse nur halb so lange einheiten hat beträgt ihre länge also 25 pixel. ich denk mal das hast du ja shcon bei deinem koodinatensystem mit einbezogen.
nehmen wir jetzt den punkt (1,1,1).
um ihn zu zeichnen musst du eine eiheit in jede richtung gehen.
x1 --> du gehst 25 pixel runter und 25 nach links
x2 --> du gehst 50 pixel nach rechts
x3 --> du gehst 50 pixel hoch
wenn du dir das jetzt 2 - dimensional vorstellst bedeutet das, dass du in der x ebene 50 nach recht un wieder 25 nach links gehst --> also gehst du insgesamt nur 25 :-P
in der y-Ebene gehst du 50 pixel nach oben und wieder 25 nach unten --> du hast also nur 25 nach oben
ich hoff du verstehst das prinzip :lol:
Delphi-Quelltext
1: 2: 3: 4:
| x := Trunc(Image1.width div 2-25*1+ 1*50); y := Trunc(Image1.height div 2+25*1- 1*50); |
Hidden - Mo 22.09.08 15:12
Hi,
Du hast Punkte im 3D-Raum und projizierst diese auf eine 2D-Ebene =). Ein Blick ist ein Strahl, also eine Halbgerade. Gegeben sind für die Projektion eines Punktes P der Punkt P selbst, sowie der Blickpunkt Q des Beobachters.
Diese zwei Punkte legen die Gerade fest; die Projektion ist nun der Schnittpunkt dieser Gerade mit deiner Projektionsfläche.
Nun lässt sich das Problem auf 2D übertragen: Du hast eine Strecke S sowie zwei Punkte P und Q(der Beobachter, dafür wählst du einfach einen beliebigen Fixpunkt im negativen z-Bereich vor der Strecke) und suchst den Schnittpunkt der Gerade durch diese zwei Punkte mit der Strecke S.
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure Project2D(x, y, z: Integer); begin result.X := Schnittpunkt(Gerade(TPoint(x, z), TPoint(-1, 0)), Gerade(Y=0)); result.Y := Schnitt(Gerade((y, z), (-1, 0)), Gerade(y=0)); end; |
Dann kann ich ja jetzt die letzten zwei Jahre Schule überspringen und direkt mit dem Studium anfangen 8)
mfG,
ene - Mo 22.09.08 15:17
Ich hab auch noch ne Lösungsmöglichkeit. Mach eine Höhenkarte daraus, wenn du den z-Wert auch zur Veranschaulichung brauchst. Dann ist z der Farbwert des Pixels.
Yogu - Mo 22.09.08 15:54
Wenn du Lust hast, kannst du dir mal
diesen Thread [
http://www.delphi-forum.de/viewtopic.php?t=77227] von mir anschauen. Ich habe erstmal ohne fremde Hilfe versucht, das Problem 3D zu 2D zu lösen - und bin auf diese Lösungsformel gekommen:
Yogu hat folgendes geschrieben: |
Je weiter ein Punkt enternt ist, desto näher neigt er zur Betrachtermitte. Ein Punkt, der genau vor der Nase (oder besser vor den Augen) schwebt, dehnt sich über die Gesamte Anzeigefläche aus. Weiter hinten sind die Punkte enger zusammen, deshalb erscheinen die Objekte dort kleiner. |
Im verlinkten Thread findest du ein paar Methoden, die richtig zusammengesetzt 3D-Linien anzeigen können. Das ganze basiert zwar auf
Canvas.Pixels (:oops:), aber da es doublebuffered ist, läuft das Ganze doch ganz flüssig.
(Ich hoffe mal, dass ich dir dadurch jetzt nichts falsches beibringe. Vielleicht gibt es bessere Wege.)
darkdester - Mo 22.09.08 16:28
danke leute :)
hab jetzt nochmal rumprobiert und jetzt scheints zu funktionieren..
nur einwas ist komisch...: mein diagonalengerade (45° wie im schulhefter) verläuft korrekt, allerdings wenn ich die koordinaten mit wurzel2 verrechne sind die punkte etwas zu weit links und wenn ich mit 1/2 mach dann siehts aus als würde er auf 22,5° laufen...
denk ich falsch oder was läuft da falsch *g*?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!