Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Suche Abbildungsmatrix (https://www.delphipraxis.net/81222-suche-abbildungsmatrix.html)

Eichhoernchen 22. Nov 2006 21:33


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

alzaimar 22. Nov 2006 21:37

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.

rayman 22. Nov 2006 21:51

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:
canvas.x := canvas_mitte.x + (punkt.x - blickpunkt.x) / punkt.z;
canvas.y := canvas_mitte.y + (punkt.y - blickpunkt.y) / punkt.z;
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.

€: ein paar "musstu" hab ich weggemacht. sah nicht nett aus

Cöster 22. Nov 2006 21:56

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.

Eichhoernchen 22. Nov 2006 22:02

Re: Suche Abbildungsmatrix
 
Ahh, ja gute Idee... das versuch ich einfach mal, mal schauen, was ich da für ein Gebilde bekomme!

Eichhoernchen 22. Nov 2006 22:25

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.

rayman 23. Nov 2006 09:41

Re: Suche Abbildungsmatrix
 
Wenn du es so machst, wie ich gemeint hab, sieht es noch besser aus:

Delphi-Quellcode:
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;
probiers mal ;)


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