![]() |
Suche Abbildungsmatrix
Hallo,
ich bin gerade dabei mir ein kleines Programm zu schreiben, dass einen Würfel auf einem Canvas drehen lassen soll. Das mit dem drehen und allem habe ich schon realisiert mit ein paar Drehmatrixen. (wie ist der Plural?) Nun stellt sich mir die Frage, ob es eine Abbildungsmatrix gibt, mit der man sozusagen einen 3D Vektor auf eine 2D Ebene projizieren kann, sprich ich hab einen Punkt mit x, y und z Koordinate, diese möchte ich nun gern auf einer 2D Ebene (einem Canvas) abbilden, so dass der Würfel, den ich aus den Punkten erstelle, perspektivisch wirkt als ob ich ihn auf ein Blatt Papier zeichnen würde. Und jetzt kommt mir nicht, dass ich OpenGl oder DirectX nutzen soll, dass will ich nicht. Irgendwie muss das ja gehen, nur bin ich mir nicht sicher, ob es für sowas schon "vorgefertigte" Matrixen (??) gibt! Danke Eichhoernchen |
Re: Suche Abbildungsmatrix
Das Wort heißt 'Matrizen'. Alle geometrischen Operationen, also Projektion, Rotation etc. sind durch Matrixmultiplikationen beschrieben, also müsste es möglich sein, die entsprechenden Matrizen miteinander zu verknüpfen (also multiplizieren), um deine gewünschte Operationsmatrix zu erhalten. Du musst nur auf die Reihenfolge achten.
|
Re: Suche Abbildungsmatrix
Die perspektivische Verzerrung ist aber nicht einfach durch Multiplikation mit einer Matrix zu verwirklichen, weil bei sowas alles linear bleibt (strecken, drehen, u.s.w.).
Du musst am Ende (nach der Projektion auf die "BildEbene") noch jeden Punkt (x, y) ans Bildzentrum (Blickpunkt) ranrücken, je nachdem, wie weit er vom Betrachter entfernt ist (z). also: (pseudo)
Code:
dann kannst du etwas rumprobieren, wie gut das mit dem z klappt. Eventuell sollte du das Ganze noch etwas skalieren (in z-Richtung) damit es schön aussieht. Je weiter deine Kamera vom Gegenstand weg sein soll, desto mehr ist in z-Richtung zu stauchen.
canvas.x := canvas_mitte.x + (punkt.x - blickpunkt.x) / punkt.z;
canvas.y := canvas_mitte.y + (punkt.y - blickpunkt.y) / punkt.z; €: ein paar "musstu" hab ich weggemacht. sah nicht nett aus |
Re: Suche Abbildungsmatrix
Interessantes Thema :-D
Man kann ein 3D-Koordinatensystem ja auf ein Blatt zeichnen: Die x- und y-Achse ganz normal, die z-Achse geht um 45° schräg nach oben. Die Länge einer Einheit auf der x- und y-Achse ist 1 cm. Auf der z-Achse ist eine Einheit Sqrt(2)/2 cm lang, also ungefähr 0,7 cm. Um einen Punkt(X, Y, Z) aus 3D in 2D umzurechnen, verschiebst du den Punkt(X, Y) um Z*Sqrt(2)/2 nach oben rechts. Punkt(1, 2, 3) wäre also Punkt(1,2) um 3*Sqrt(2)/2 (ca. 2) nach oben rechts verschoben. Wie verschiebt man einen Punkt jetzt um n*Sqrt(2)/2 nach oben rechts? man geht um n/2 nach rechts und um n/2 nach oben. Ich denke, das ließe sich so realisieren. |
Re: Suche Abbildungsmatrix
Ahh, ja gute Idee... das versuch ich einfach mal, mal schauen, was ich da für ein Gebilde bekomme!
|
Re: Suche Abbildungsmatrix
Liste der Anhänge anzeigen (Anzahl: 1)
So, klappt wunderbar, so wie es Cöster beschrieben hat.
Ich häng mal mein Progrämmchen an, dort wird ein "Würfel" (8 Punkte, aber das Gehirn denkt sich scheinbar die Linien dazu[man erkennt irgendwie ganz gut, dass es nen Würfel ist]) mit nem Timer in Y und in Z Richtung auf nem Canvas gedreht. |
Re: Suche Abbildungsmatrix
Wenn du es so machst, wie ich gemeint hab, sieht es noch besser aus:
Delphi-Quellcode:
probiers mal ;)
const
NEAR_PLANE = 1; ZOOM = 80; DISTANCE = 30; procedure TForm1.DrawCube(M: TCube); var i: integer; Pixel: T3DVektor; Mitte: TPoint; begin Image1.Canvas.Rectangle(0,0, image1.Width, image1.Height); Mitte.x := Image1.Width div 2; Mitte.y := Image1.Height div 2; for i := 1 to 8 do begin Pixel := M[i]; if (pixel.z + distance > NEAR_PLANE) then begin Pixel.x := ZOOM*Pixel.x / (Pixel.z + DISTANCE) + Mitte.x; Pixel.y := ZOOM*Pixel.y / (Pixel.z + DISTANCE) + Mitte.y; Image1.Canvas.Pixels[round(Pixel.X), round(Pixel.y)] := clblack; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz