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

user profile icondarkdester 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.

user profile icondarkdester 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:
user profile icondarkdester 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:
// (1,1,1)
x := Trunc(Image1.width div 2-25*11*50);    // weil ja dein koordinatensystem in der Mitte des Images 0 ist 
                                                  // teilst du die Länge durch 2
y := Trunc(Image1.height div 2+25*11*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(-10)), Gerade(Y=0));
  result.Y := Schnitt(Gerade((y, z), (-10)), 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:

user profile iconYogu 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*?