Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 3D Würfel mit Canvas, bitte um Hilfe (https://www.delphipraxis.net/107915-3d-wuerfel-mit-canvas-bitte-um-hilfe.html)

emerica2511 4. Feb 2008 15:54


3D Würfel mit Canvas, bitte um Hilfe
 
Erstmal hallo zusammen, :hi:
ich hab folgendes Problem und hoffe ihr könnt mir dabei helfen. Habe schon mehrere Threads dazu gelesen aber ich verstehe es einfach nicht.
Ich soll einen Würfel in 3D darstellen mit Canvas, der sich drehen kann und den ich womöglich noch auf dem Bildschirm wandern lassen kann. Aber es geht mir erstmal nur darum den Würfel drehen zu lassen.
Ich denke es ist einfacher dieses Problem mit der Parallelprojektion zu lösen jedoch verstehe ich einfach die Mathematik dahinter nicht.
Ich habe mir folgendes überlegt, der Würfel befindet sich in einem dreidimensionalem Koordinatensystem, der Mittelpunkt des Würfels ist der Ursprung des Koordinatensystem (0|0|0) und er dreht sich entweder um die X-, die Y- oder die Z-Achse. Nun müsste ich ja beim drehen als erstes die neuen Koordianten im dreidimensionalen Koordinatensystem berechnen (also die Koordinaten der Eckpunkte) und diese dann umrechnen, sodas diese auch korrekt auf meinem 2d-Koordinatensystem Canvas angezeigt werden. Es wäre echt nett wenn mir das jemand erklären könnte mit Formeln. Hoffe ihr könnt mir helfen!

Gruß Emerica

turboPASCAL 4. Feb 2008 17:03

Re: 3D Würfel mit Canvas, bitte um Hilfe
 
Uff, da müsste man viel erklären. Eigentlich um sich was drehen zu lassen reicht sin und cos.
Damit kannst du dann einen Eckpunt im Koord.sys. des Würfels errechnen, Stichwort Kreisberechnung.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure MyPaint;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  r1: single;
  r2: single;
  n: integer = 4;
  x, y, z: integer;

  Phi: single;

  isMouseDown: Boolean = FALSE;

procedure TForm1.MyPaint;
var
  c: Integer;
begin
  with Canvas do
  begin
    Brush.Color := Color;
    FillRect(ClientRect);
    Pen.Color := clGray;

    Pen.Style := psClear;
    Brush.Color := clRed;

    r1 := 10;
    r2 := 60;
    z := round(r2 / 1.5);

    for c := 0 to n do
    begin
      x := round(cos(c * 2 * Pi / n + Phi) * (r1 - r2));
      y := round(sin(c * 2 * Pi / n + Phi) * (r1 - r2));

      FillRect(RECT(200 + x - 2, 200 + y - 2, 200 + x + 2, 200 + y + 2));
      FillRect(RECT(200 + x - 2, 200 + y - 2 - z, 200 + x + 2, 200 + y + 2 - z));
    end;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  MyPaint;
  if Phi < (2 * Pi) - 0.1 then Phi := Phi + 0.1 else Phi := 0.0;
end;

end.
Der Rest ist nun einfach...

shmia 4. Feb 2008 17:17

Re: 3D Würfel mit Canvas, bitte um Hilfe
 
Angenommen, du hast alle Eckpunkte des Würfeln als (x,y,z)-Vektor.
Um den Würfel zu drehen, muss eine Multiplikation mit einer 3*3 Matrix ausgeführt werden.
http://home10.inet.tele.dk/moelhave/...ormations.html

Die Multiplikation ist für jeden Eckpunkt durchzuführen.

Zum Zeichen lässt man einfach die Z-Ebene weg, und berücksichtigt nur die x & y Anteile der Punkte.
Jetzt hast du zusätzlich noch das Problem der Linien, die eigentlich nicht sichtbar sein dürfen (stichwort: Z-Buffer)
http://olli.informatik.uni-oldenburg...ow8/page1.html

omata 4. Feb 2008 22:24

Re: 3D Würfel mit Canvas, bitte um Hilfe
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo emerica2511,

vielleicht hilft dir ja das weiter...

Gruss
Thorsten

emerica2511 5. Feb 2008 12:15

Re: 3D Würfel mit Canvas, bitte um Hilfe
 
Vielen dank, für die schnellen und hilfreichen Antworten. Der Würfel kann sich nun drehen, habe dazu die Formeln von shmia´s link genommen, jetzt tut sich mir aber ein weiteres Problem auf.
Ich erechne die Koordinaten und runde dann beim darstellen mit Canvas, da ja nur Integerzahlen als Koordinaten in Frage kommen, rechne aber mit den Kommawerten weiter (also immer wieder die neuen Koordinaten) nun hab ich aber das Problem, wenn ich die Drehung in einen Timer packe, damit´s schick aussieht errechnet das Programm ja mehrere hundert mal die Koordinaten und (ich vermute, dass) duch Pi und die anderen Kommazahlen, das Ergebnis einfach immer immer ungenauer wird und so auch meine Koordinaten. Hat da vieleicht jemand eine Idee wie ich diese Ungenauigkeiten kommpensieren könnte?

Gruß und nochmals vielen Dank euch allen für die Hilfe,
Emerica

Kroko1999 5. Feb 2008 12:18

Re: 3D Würfel mit Canvas, bitte um Hilfe
 
die Koordinaten immer in float lassen und nur die Anzeige in Integer umrechnen!

emerica2511 5. Feb 2008 13:27

Re: 3D Würfel mit Canvas, bitte um Hilfe
 
Ja das habe ich mir auch gedacht und habe es auch letztlich so gemacht, siehe da: der Würfel verformt sich nicht mehr so stark bzw. so früh (wie man´s nimmt)
Wenn ich den Würfel allerdings mit einem Timer rotieren lasse (dabei werden dann locker mal mehr als 300 oder 400 mal die Koordinaten neu berechnet) fängt der Würfel jedoch trotzdem an sich zu verformen :(

iGoA 5. Feb 2008 13:43

Re: 3D Würfel mit Canvas, bitte um Hilfe
 
Du musst die Rotation immer auf Deinen ursprünglichen Würfel anwenden und dafür den Winkel eben immer entsprechend verändern. Ich vermute, dass Du zur Zeit die Rotation auf den zuvor bereits rotierten Würfel anwendest. So summieren sich alle Rundungsfehler irgendwann immer.

shmia 5. Feb 2008 13:44

Re: 3D Würfel mit Canvas, bitte um Hilfe
 
Zitat:

Zitat von emerica2511
Wenn ich den Würfel allerdings mit einem Timer rotieren lasse (dabei werden dann locker mal mehr als 300 oder 400 mal die Koordinaten neu berechnet) fängt der Würfel jedoch trotzdem an sich zu verformen :(

Die Transformationsmatrix sollte nur einmal berechnet werden und dann für alle 8 Eckpunkte angewendet werden.
Das spart jede Menge von Sin() und Cos() aufrufen.
Und du solltest die Funktion SinCos() verwenden, wenn du Sinus und Cosinus Werte zu einem Winkel brauchst. Das spart ~ 50%.

PS: wäre nicht schlecht, wenn du dein Programm als Open Source rausgeben würdest.
Könnte mir vorstellen, dass dies Einige interessiert (für Screensaver und andere Spielereien).

Patty92 12. Feb 2010 10:36

Re: 3D Würfel mit Canvas, bitte um Hilfe
 
Hi,
kann mir vielleicht jemand mal genau erklären, wie ich einen Würfel zu drehen bekomme.
Er soll sich einfach nur im Kreis drehen.
Den Würfel habe ich schon.
Es wäre total cool wenn ihr mir helfen könnt.
Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz