![]() |
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 |
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:
Der Rest ist nun einfach...
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. |
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. ![]() 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) ![]() |
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 |
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 |
Re: 3D Würfel mit Canvas, bitte um Hilfe
die Koordinaten immer in float lassen und nur die Anzeige in Integer umrechnen!
|
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 :( |
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.
|
Re: 3D Würfel mit Canvas, bitte um Hilfe
Zitat:
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). |
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 04:07 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-2025 by Thomas Breitkreuz