WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Drehmatrix um beliebige Drehachse

 

dabauer82
Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 07.04.2008, 08:42     Titel: Drehmatrix um beliebige Drehachse
  Antworten mit Zitat      
Hallo,

ich schildere erst mal mein Ziel und dann meine zwei Probleme .-)

Mir sind mehrere Punkte gegeben und eine Drehachse im Raum. Alles natürlich beliebig. Der Ursprung des KOS liegt auch irgendwo. Diese Punkte sollen nun um diese Drehachse um einen beliebigen Winkel gedreht werden.

Variante 1.
Ich hatte über Hilfsebene und Schnittpunkt den Abstand des Punktes zu meiner Gerade bestimmt usw. Allerdings hatte das nur für das ebene Probleme und nicht den R3 funktioniert.

Variante 2.
Ich habe mir bei Wiki noch mal die Sache mit den Drehmatrizen angesehen und fand dassei dei beste Lösung. Dort gibt es auch eine DM für eine beliebige Drehachse, aber bei mir erfolgt die Drehung nicht über diese Gerade sondern nur parallel dazu. Der Drehursprung ist nach wie vor [0,0,0]. Wie kann ich diese Drehung in meine Drehachse verschieben? oder sogar dort ausführen?

Code:
function [ newPoint ] = calcRotation( P, U, V, alpha )
% Berechnet die Drehung eines Punktes P um eine beliebige Gerade mit den
% Zwei Punkten U und V bzw dem daraus resultiernenden Richtungsvektor R

% Richtungsvektor, normiert
R = V - U
R = R / norm(R)


% Drehmatrix allgemein
% -pi < x < pi
%{
DM = [cos(alpha) + (R(1)^2)*(1 - cos(alpha)), R(1)*R(2)*(1 - cos(alpha)) - R(3)*sin(alpha), R(1)*R(3)*(1 - cos(alpha)) + R(2)*sin(alpha);
    R(2)*R(1)*(1 - cos(alpha)) + R(3)*sin(alpha), cos(alpha) - (R(2)^2)*(1 - cos(alpha)), R(2)*R(3)*(1 - cos(alpha)) - R(1)*sin(alpha);
    R(3)*R(1)*(1 - cos(alpha)) + R(2)*sin(alpha), R(3)*R(2)*(1 - cos(alpha)) + R(1)*sin(alpha), cos(alpha) - (R(3)^2)*(1 - cos(alpha))]
%}

% Degree
DM = [cosd(alpha) + (R(1)^2)*(1 - cosd(alpha)), R(1)*R(2)*(1 - cosd(alpha)) - R(3)*sind(alpha), R(1)*R(3)*(1 - cosd(alpha)) + R(2)*sind(alpha);
    R(2)*R(1)*(1 - cosd(alpha)) + R(3)*sind(alpha), cosd(alpha) - (R(2)^2)*(1 - cosd(alpha)), R(2)*R(3)*(1 - cosd(alpha)) - R(1)*sind(alpha);
    R(3)*R(1)*(1 - cosd(alpha)) + R(2)*sind(alpha), R(3)*R(2)*(1 - cosd(alpha)) + R(1)*sind(alpha), cosd(alpha) - (R(3)^2)*(1 - cosd(alpha))]

% Berechnung Vektor*Matrix
newPoint = DM*P;


Private Nachricht senden Benutzer-Profile anzeigen


outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 07.04.2008, 09:21     Titel:
  Antworten mit Zitat      
Habe mich zwar nicht vertieft in Deine Aufgabenstellung, jedoch denke ich solltest Du die Funktion HGTRANSFORM etwas genauer unter die Lupe nehmen.


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.318
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 07.04.2008, 10:46     Titel:
  Antworten mit Zitat      
In Spalte 3 Zeile 3 der Drehmatrix muss laut Wikipedia cos(a)+... stehen
Du hast da aber ein - stehen. Vielleicht liegts ja daran...
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 07.04.2008, 12:15     Titel:
  Antworten mit Zitat      
hallo,

durch den Tipp auf hgtransform bin ich auf
Code:
M = makehgtform('axisrotate',[ax,ay,az],t)

gestoßen. Also die Drehmatrix nur ohne Tippfehler Smile

Aber leider funktioniert dieses auch nicht. Ich vermute mal, dass an der "Achse" liegt. Allerdings erläutert die Hilfe nicht was unter ax, ay, und az verstanden werden muss. Ich hatte es so interpretiert, dass ich für ax bis az die komponenten meines nomierten Richtungsvektors R nehme, welcher sich aus den beiden Punkten U und V bildet (R = U-V);

hgtransform verstehe ich auch...


Code:

function [ newPoint ] = calcRotation( P, U, V, alpha )

% Richtungsvektor, normiert
R = V - U;
R = R / norm(R);


alpha_rad = alpha*(pi/180);
Ra = makehgtform('axisrotate',[R(1),R(2),R(3)],alpha_rad)

% Berechnung Vektor*Matrix
newPoint = Ra*P
 
Private Nachricht senden Benutzer-Profile anzeigen
 
dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 07.04.2008, 18:34     Titel:
  Antworten mit Zitat      
Vielleicht kann mir jmd jetzt weiterhelfen. Ich bin ein-zwei-Schritte weitergekommen aber so richtig rund läuft es noch nicht.

hgtranform habe ich erstmal aussenvor gelassen, da für mich nicht ersichtlich war, wie diese Transformation zum Berechnen des neuen Punktes nüzlich sein kann

Ich stütze mich zur Zeit auf die Anleitung von hier - Rotation um eine beliebige Achse - wobei allerdings die dort Beschreibene Verkettung der Rotationsmatrizen durch die Matlab-Funktion

Code:
Ra = makehgtform('axisrotate',[R(1),R(2),R(3)],alpha_rad);
substituiert werden kann...

Kurze Zusammenfassung. Rie Rotationsachse muss in den Ursprung tranformiert werden, über Txyz(-P), Rotiert werden über Ra und dann zurück transfomiert werden über Txyz(+P) - aber leider scheint es einen Fehler zu geben. Die Rotation erfolgt immer noch um NULL und nicht um die Drehachse. Kann mir bitte einer Weiterhelfen?

grüße

Code:

function [ newPoint ] = calcRotation( P, U, V, alpha )
% Berechnet die Drehung eines Punktes P um eine beliebige Gerade mit den
% Zwei Punkten U und V bzw dem daraus resultiernenden Richtungsvektor R

% Richtungsvektor, normiert
R = V - U
R = R/sqrt(dot(R,R))


% Drehmatrix allgemein

alpha_rad = alpha*(pi/180);
P(4) = 1;

Txyz1 = makehgtform('translate',[U(1) U(2) U(3)]);
Txyz2 = makehgtform('translate',[-U(1) -U(2) -U(3)]);
Ra = makehgtform('axisrotate',[R(1),R(2),R(3)],alpha_rad);
newPoint = Txyz2*Ra*Txyz1*P

 


Ausgangssituation:


Translation in NULL:


Rotation in NULL:


Translation zurück:



Die Gerade müsste, um das richtige Ergebnis zu haben, parallel-Verschoben sein so dass B und V identisch sind. Die Gleichung müsste hierfür Richtig sein aber ich verstehe nicht warum sich nichts ändert bzw ich vermute dass es daran liegt, dass sich durch die Drehung der zu rotierende Punkt auch eine Translation erfährt und demnach mit der ZUrücktranslation zu weiter transformiert wird...oder so Wink[/img]
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.