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

3D cube - Rotation

 

sakul85
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 28.09.09
Wohnort: ---
Version: 6.5
     Beitrag Verfasst am: 18.02.2010, 21:06     Titel: 3D cube - Rotation
  Antworten mit Zitat      
Hallo,
Im folgenden Programm habe ich einen dreidimensionalen Würfel mit der Funktion „multifaceted Patches“ in MATLAB generiert. Der Würfel besteht aus sechs Flächen und acht Kanten die ausgehend von einem festgelegtem Koordinatenmittelpunkt aufgespannt werden [x,y,z,].

Über eine Eingabe werden in der späteren Anwendung die neuen Koordinaten geliefert (normiert auf Einheitskreis -1 bis +1), anschließend werden die Lagewinkel (yaw-, roll-, nickwinkel) im Raum bestimmt und über eine Rotationsmatrix der Würfel entsprechend der Drehrichtung ausgelenkt.
Derzeit wird die Rotation über eine “for Schleife“ realisiert, die eine Drehung des Würfels um 90° ermöglicht.

Das funktioniert soweit sehr gut bis auf ein Paar (kleine) Probleme:
(1)Die Komplette Drehung um 360° läuft nicht richtig – z.B. bei der Drehung um die Y Achse rollte sich der Würfel nach 90° über die orthogonal liegende X Achse ab und bleibt in einer undefinierten Position stehen.
(2) Außerdem bekomme ich mit der von mir verwendeten Rotationsmatrix nur eine Drehrichtung um die X Achse(Nick) oder Y Achse(Roll) realisiert. D.h. egal welche Koordinatenwerte ich eingebe der Vektor läuft immer in eine Richtung. Siehe dazu im Quelltext ‚Linksdrehung‘ oder ‚Rechtsdrehung‘.
Ich stelle den Quelltext hier zur Verfügung, Version: MATLAB R2007b
und bedanke mich im Voraus über hilfreichen Input.

Code:

% Drehachsenkoordinaten Cube

for h=0.01:0.01:1
    display('next step')
    d=input('prompt')
xyz=[0.01,0.01,1];

yz=[0,xyz(2),xyz(3)];
xz=[xyz(1),0,xyz(3)];
xy=[xyz(1),xyz(2),0];

% Zeichnen des Drehachsenmittelpunktes
plot3(xyz(1),xyz(2),xyz(3),'*');
hold on

%Linksdrehung
%XeYeZe=[0.01-h,0.01,1-h];
%Rechtsdrehung
XeYeZe=[h,0.01,1-h];

YeZe=[0,XeYeZe(2),XeYeZe(3)];
XeZe=[XeYeZe(1),0,XeYeZe(3)];
XeYe=[XeYeZe(1),XeYeZe(2),0];

% Rotationsmatrix
% Yaw = Rotation um z Achse       |          z|
% Roll = Rotation um die y Achse  |           |_ _y
% Nick = Rotation um x Achse      |         x/

% Skalarprodukt

yz_betr=sqrt(yz(1)^2 + yz(2)^2 + yz(3)^2);
YeZe_betr=sqrt(YeZe(1)^2+YeZe(2)^2+YeZe(3)^2);

xz_betr=sqrt(xz(1)^2 + xz(2)^2 + xz(3)^2);
XeZe_betr=sqrt(XeZe(1)^2+XeZe(2)^2+XeZe(3)^2);

xy_betr=sqrt(xy(1)^2 + xz(2)^2 + xz(3)^2);
XeYe_betr=sqrt(XeYe(1)^2+XeYe(2)^2+XeYe(3)^2);

alpha=acos((yz*YeZe')/(yz_betr*YeZe_betr));
beta=acos((xz*XeZe')/(xz_betr*XeZe_betr));
gamma=acos((xy*XeYe')/(xy_betr*XeYe_betr));

% Umrechnung in Grad
Pi=3,1415926;
w_alpha=alpha*180/Pi
w_beta=beta*180/Pi
w_gamma=gamma*180/Pi

rx = [1 0 0;0 cos(alpha) -sin(alpha);0 sin(alpha) cos(alpha)];
ry = [cos(beta) 0 sin(beta);0 1 0;-sin(beta) 0 cos(beta)];
rz = [cos(gamma) -sin(gamma) 0;sin(gamma) cos(gamma) 0; 0 0 1];
rotation = rx*ry*rz;


% Ecken Cube , siehe Hilfe zu patch und Multifaceted Patches
this_EdgeLength = 3;
d = this_EdgeLength/2;
% Eckenkoordinaten 1:8
vertices(:,1,:)=[XeYeZe(1)-d;XeYeZe(1)+d;XeYeZe(1)+d;XeYeZe(1)-d;XeYeZe(1)-d;XeYeZe(1)+d;XeYeZe(1)+d;XeYeZe(1)-d];
vertices(:,2,:)=[XeYeZe(2)-d;XeYeZe(2)-d;XeYeZe(2)+d;XeYeZe(2)+d;XeYeZe(2)-d;XeYeZe(2)-d;XeYeZe(2)+d;XeYeZe(2)+d];
vertices(:,3,:)=[XeYeZe(3)-d;XeYeZe(3)-d;XeYeZe(3)-d;XeYeZe(3)-d;XeYeZe(3)+d;XeYeZe(3)+d;XeYeZe(3)+d;XeYeZe(3)+d];

for m=1:8
    vertices(m,:,:)=rotation*vertices(m,:,:)';
end

% Flächen Cube, siehe Hilfe zu patch und Multifaceted Patches
faces = [1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8;1 2 3 4;5 6 7 8];

% Zeichne Cube
    patch('Vertices',vertices,'Faces',faces,'FaceAlpha',0.5,'FaceColor','flat','FaceVertexCData',hsv(6))

% ModelkoordinatenSystem X Y Z Achse
line([-5 5],[0.01 0.01],[1 1],'linewidth',1,'color',[0,0,0]);
line([0.01 0.01],[-5 5],[1 1],'linewidth',1,'color',[0,0,0]);
line([0.01 0.01],[0.01 0.01],[-5 5],'linewidth',1,'color',[0,0,0]);

% WeltkoordinatenSystem

axis([-5,5,-5,5,-5,5])
xlabel('X-Achse')
ylabel('Y-Achse')
zlabel('Z-Achse')
grid on
hold off
end


cube_3d.m
 Beschreibung:
Cube_3d

Download
 Dateiname:  cube_3d.m
 Dateigröße:  2.59 KB
 Heruntergeladen:  708 mal
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 - 2025 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.