Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Rotation - Drehmatrix (https://www.delphipraxis.net/167195-rotation-drehmatrix.html)

foerster7892 17. Mär 2012 08:44

Delphi-Version: 5

Rotation - Drehmatrix
 
Ja hi,
ich arbeite gerade an nem Programm welches in R³ Punkte/Körper/Geraden drehen soll.
Mein Problem ist, dass wenn ich das drehen über mehrere Achsen nutze via eulersche Winkel(sind eigl. nur die Transformationsmatrizen für die Rotation um die x,y,z-Achse multipliziert und halt optimal gekürzt) irgendwie die Drehungen nicht stimmen.

Delphi-Quellcode:
points2D[k].x1:=points3D[k].x1 * ((cos(av)*cos(cv)-sin(av)*cos(bv)*sin(cv))-(cos(av)*sin(cv)+sin(av)*cos(bv)*cos(cv))+(sin(av)*cos(bv)))-((points3D[k].x3*((sin(bv)*sin(cv))-(sin(bv)*cos(cv))+cos(bv)))/2*sqrt(2));
points2D[k].x2:=points3D[k].x2 * ((sin(av)*cos(cv)+cos(av)*cos(bv)*sin(cv))+(cos(av)*cos(bv)*cos(cv)-sin(av)*sin(cv))-(cos(av)*sin(bv)))-((points3D[k].x3*((sin(bv)*sin(cv))-(sin(bv)*cos(cv))+cos(bv)))/2*sqrt(2));
ich weiß nicht genau ob der Fehler hier liegt aber ich vermute es. Finden konnte ich ihn auch noch nicht.
Wenn jemand wissen will wie das hergeleitet wird - hilft manchmal zum verständnis kann ich dies gerne erläutern(ist eigl. simpel).

Ich hatte davor ein Programm geschrieben, damit konnte man einen Würfel drehen um jeweils eine Achse, dies lief ohne Probleme und nun wollte ich die Achsen halt kombinieren und beliebige Körper darum drehen.

Als Beispiel kann man wieder einen Würfel verwenden:
A(100|-100|-100); B(100|100|-100); C(100|100|100); D(100|-100|100); E(-100|-100|-100); F(-100|100|-100); G(-100|100|100); H(-100|-100|100);

Hier tritt ein weiteres Problem auf welches ich nicht erklären kann, der Punkt A und der Punkt E werden falsch dargestellt. Außerdem sieht man hier wunderbar, dass sich der Würfel nicht einheitlich dreht sondern alle Punkte irgendwie komisch unterschiedlich wobei allerdings jeder Punkt am Ende wieder die Ausgangsposition erreicht. Wenn ich eine Strecke mit einem Punkt im Ursprung drehe habe ich das Gefühl, dass die Drehung stimmt.
Ich hoffe jemand kann mir helfen, ich würde es muss es bis Dienstag fertig bekommen, dann muss ich es in der Schule vorstellen.



Ja hier das gesamte Programm als zip (.exe + alles andere)
Programm

kurze Erläuterung zum Programm:
1 ihr müsst zuerst die anzahl der Punkte wählen und dann die Punkte eintragen -300<=x<=300; -300<=y<=300
2 nun könnt ihr die Punkte verbinden in dem ihr zb. schreibt:
1,2,3,1 -> Dreieick und 1,4 und 2,4 und 3,4 -> Pyramide (der Verbindungsreset geht leider nicht, da muss das Programm neugestartet werden)
nun könnt ihr es euch zeichnen lassen und mit den jeweiligen Winkeln !sollte! es sich eigentlich richtig drehen, tut es aber nicht.

PS.: mögliche Ideen um das Programm funktionstüchtig zu machen würden mir reichen, wenn ich irgendetwas schlecht erklärt oder undeutlich dargestellt habe würde ich mich über eine Frage auch freuen!

Jens01 20. Mär 2012 12:39

AW: Rotation - Drehmatrix
 
Hier : http://wiki.delphigl.com/index.php/Tutorial_Nachsitzen gibt es neben diesem noch einige andere Tutorials zu Deinem Thema.
Eine gute Unit für diese Matrizen findest Du in dem GlScene-Projekt. Dort gibt es die Unit Vectorgeometry.pas, die hat fast alle Funktionen enthalten.

Blup 21. Mär 2012 14:35

AW: Rotation - Drehmatrix
 
Zitat:

Zitat von foerster7892 (Beitrag 1157033)
ich weiß nicht genau ob der Fehler hier liegt aber ich vermute es. Finden konnte ich ihn auch noch nicht.
Wenn jemand wissen will wie das hergeleitet wird - hilft manchmal zum verständnis kann ich dies gerne erläutern(ist eigl. simpel).

Es ist mag simpel sein, auf jeden Fall ist es schon falsch.
Für die Darstellung eines um mehrere Achsen rotierten Objekts werden nicht alle benötigten Werte berücksichtigt.

Im Prinzip derzeit:
2D.x = f(3D.x, 3D.z)
2D.y = f(3D.y, 3D.z)

aber notwendig:
2D.x = f(3D.x, 3D.y, 3D.z)
2D.y = f(3D.x, 3D.y, 3D.z)

Richtet man die Zeilen etwas aus, erkennt man einige Berechnungen, die sich gegenseitig auslöschen.
Delphi-Quellcode:
points2D[k].x1 := points3D[k].x1 * ( (cos(av)*cos(cv) - sin(av)*cos(bv)*sin(cv))
                                    -(cos(av)*sin(cv) + sin(av)*cos(bv)*cos(cv))
                                    +(sin(av)*cos(bv)))
               -((points3D[k].x3 * ( (sin(bv)*sin(cv))
                                    -(sin(bv)*cos(cv))
                                    + cos(bv)))/4*sqrt(2));

points2D[k].x2 := points3D[k].x2 * ( (cos(av)*cos(bv)*sin(cv) + sin(av)*cos(cv))
                                    +(cos(av)*cos(bv)*cos(cv) - sin(av)*sin(cv))
                                    -(cos(av)*sin(bv)))
               -((points3D[k].x3 * ( (sin(bv)*sin(cv))
                                    -(sin(bv)*cos(cv))
                                    + cos(bv)))/4*sqrt(2));

foerster7892 25. Mär 2012 10:57

AW: Rotation - Drehmatrix
 
so ich hab mittlerweile raus das die drehungen komplett richtig sind allerdings werden die Punkte generell falsch dargestellt.
Hab das Programm gerade nicht zur Hand deshalb kann ich im Mom nichts weiter antworten.
Und ja da waren überflüssige Winkelfunktionen dabei, ändert aber nichts an der Funktionalität.

Allerdings werden die Punkte falsch dargestellt. -> hab ich durch TextOut gemerkt. So gibt es ganze 2 Nullpunkte in meinem Koordinatensystem an zwei unterschiedlichen stellen.

mz23 25. Mär 2012 12:43

AW: Rotation - Drehmatrix
 
Habe mich vor über 20 Jahren mit demselben Problem herumgeschlagen.
Erinnere mich noch dunkel daran, die Werte der Winkel nicht in
Rad umgerechnet zu haben, sondern Deg eingesetzt :)

Was mir noch in Erinnerung geblieben ist, das Drehen mußte man
immer aus den Originalkoordinaten herausberechnen, da sonst
Rundungsfehler die Körper bei mehreren Drehungen deformierten.

Schöne Grüße aus Nürnberg,
Manfred

foerster7892 25. Mär 2012 16:50

AW: Rotation - Drehmatrix
 
nö das ist nicht mein Problem - hab ja nen würfel problemlos drehen können^^.

Blup 26. Mär 2012 08:46

AW: Rotation - Drehmatrix
 
Zitat:

Zitat von foerster7892 (Beitrag 1158422)
Und ja da waren überflüssige Winkelfunktionen dabei, ändert aber nichts an der Funktionalität.

Hat auch niemand behauptet, ist aber ein Ansatzpunkt für die Fehlersuche.

Zitat:

Zitat von foerster7892 (Beitrag 1158422)
so ich hab mittlerweile raus das die drehungen komplett richtig sind allerdings werden die Punkte generell falsch dargestellt.

Frag mich wie du das ermittelt hast, da deine Berechnung der Rotation und der Transformation in 2D-Koordinaten zusammen erfolgen. Ich würde beides in dieser Form trennen:

Rotation
Tmp3D.x = f(3D.x, 3D.y, 3D.z)
Tmp3D.y = f(3D.x, 3D.y, 3D.z)
Tmp3D.z = f(3D.x, 3D.y, 3D.z)
Transformation
2D.x = f(Tmp3D.x, Tmp3D.y, Tmp3D.z)
2D.y = f(Tmp3D.x, Tmp3D.y, Tmp3D.z)

terence14 29. Mär 2013 06:31

AW: Rotation - Drehmatrix
 
Hallo liebe DP-Gemeinde,

ich habe mich mit Projektion von 3D in 2D Koordinaten etwas beschäftigt
sowie mit der Drehung eines Körpers um seinen Mittelpunkt.

Anbei ein kleines Testprogamm, natürlich inklusive Quelltexten.

Es ist in der Entstehung um einiges Auszuprobieren also erwartet
nicht, daß alle Knöpfe funktionieren. Aber das, was funktioniert
scheint i.O. zu sein.

MfG,
terence

Anhang:
PProjektion-Test_2013_03_29.zip - 29.03.2013--07:43 - 249.396 Bytes

Die Formeln dazu entnahm ich zwei Wikipedia Artikeln, die ich der
Einfachheit wegen mal angehängt habe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 Uhr.

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