2016-07-22 15 views
0

Ich habe Linie oder Trajektorie im 3D-Raum. Ich habe auch eine 2D-Form. Ich möchte diese Form annehmen und sie entlang der Kurve bewegen, wobei die Flächennormale parallel zur Tangente der Kurve bleibt. Basierend auf einem Beitrag here habe ich das erfolgreich gemacht, was etwas erzeugt, das für Formen mit Rotationssymmetrie wie ein Kreis "richtig aussieht". Sehen Sie den Code und die Abbildung unten für das Beispiel.2D-Form Gesicht mit Normalen auf 3D-Trajektorie ausrichten

% create data 
npts = 30; 
tend = 8*pi; 
t = linspace(0,tend,npts)'; 
z = linspace(-1,1,npts)'; 
omz = sqrt(1-z.^2); 
x = cos(t).*omz; 
y = sin(t).*omz; 

scatter3 (x,y,z, 'x'); 

hold on 
% fit 3 slms to data in each direction 

xslm = slmengine (t, x, 'knots', ceil(npts/1.5)); 
yslm = slmengine (t, y, 'knots', ceil(npts/1.5)); 
zslm = slmengine (t, z, 'knots', ceil(npts/1.5)); 

% test points 
tq = linspace(0,tend,200 * npts)'; 

dx = slmeval (t, xslm, 1, false); 
dy = slmeval (t, yslm, 1, false); 
dz = slmeval (t, zslm, 1, false); 

quiver3(x,y,z,dx,dy,dz); 

plot3 (slmeval(tq, xslm, 0, false), slmeval(tq, yslm, 0, false), slmeval(tq, zslm, 0, false)); 

hold off 

axis equal 

% The following taken from post on matlab central 
% 
% http://uk.mathworks.com/matlabcentral/newsreader/view_thread/159522 
% 

% P10 = P1-P0; 
% 
% P20 = P2-P0; 

% N = dot(P10,P10)*P20-dot(P20,P20)*P10; % <-- Approx. tangent direction 

R = 0.05; 

P0 = [x,y,z]; 

N = [dx, dy, dz]; 

% circle points 
% theta = linspace(0,2*pi).'; 
box_x = [ -R; R; R; -R; -R ]; 
box_y = [ -R/2; -R; R; R/2; -R/2 ]; 

for ind = 1:size(P0,1) 

    T = null(N(ind,:)).'; % Get two orthogonal unit vectors which are orthog. to N 

%  V = bsxfun (@plus, ... 
%     R * (cos(theta) * T(1,:) + sin(theta) * T(2,:)), ... 
%     P0(ind,:)); 

    V = bsxfun (@plus, ... 
       box_x * T(1,:) + box_y * T(2,:), ... 
       P0(ind,:)); 

    hold on 
    quiver3(P0(ind,1),P0(ind,2),P0(ind,3),T(1,1),T(1,2),T(1,3), 0.5, 'b'); 
    quiver3(P0(ind,1),P0(ind,2),P0(ind,3),T(2,1),T(2,2),T(2,3), 0.5, 'b'); 
    plot3(V(:,1),V(:,2),V(:,3)); 
    hold off 

end 

best attempt

Beachten Sie, dass dieser Code Verwendung der Shape Language Modelling Funktionen aus dem Matlab Dateiaustausch macht die Kurve zu machen und es ist Tangente an verschiedenen Punkten, aber dies das Problem nicht entscheidend ist.

Wie Sie jedoch sehen können, dreht sich die Drehung der Form, wenn Sie sich mit dieser Methode um die Kurve bewegen. Ich muss die Rotation der Form konsistent halten, da ich tatsächlich Werte von verstreuten 3D-Daten auf der Formoberfläche abtasten möchte, die das Innere einer "Röhre" oder wie auch immer die Form ist.

Wie kann ich die Ausrichtung meiner Form steuern, während ich mich entlang der Kurve bewege?

Antwort

0

Sie benötigen 2 Vektoren und Position! Die tangent (Sie haben es) und ein Vektor zum Ausrichten wie up, die nicht parallel zur Tangente sein muss. Dann einfach konstruieren 3D-Matrix Verwendung Tangente als Z-axis verwandeln und nutzen das Kreuzprodukt der beiden anderen zum Beispiel zu bekommen:

Up = (0,1,0) 
Z = tangent/|tangent| 
X = cross(Z,Up) 
Y = cross(X,Z) 
O = position 

Position ist nur die aktuelle Position auf der Bahn +/- Form versetzt. Sie können das Vorzeichen der X-, Y-, Z-Achsen anpassen, indem Sie sie negieren, oder indem Sie die Kreuzprodukt-Operandenreihenfolge ändern, um die Spiegelung der gewünschten Form zu erhalten. Nun zu konstruieren, die Transformationsmatrix sehen:

Jetzt nur noch verwandeln/machen Sie Ihre Form mit dieser Matrix.

+0

Danke, ich arbeite daran, deine Antwort vollständig zu verstehen, ich frage mich, wie ich 'Up' am besten auswähle. Ich habe auch das Gefühl, dass sich "Up" an jedem Punkt der Flugbahn ändern muss? – crobar

+1

@crobar nein es nicht ... zum Beispiel kann das "up" die Achse deiner Helix sein die Trajektorie schwingt herum. Die Cross-Produkte verändern die Ausrichtung automatisch für Sie. Dies wird normalerweise verwendet, um das NEH-Koordinatensystem (North East Height) in Luftfahrtanwendungen und/oder Oberflächennavigationen zu erhalten. Der Referenzvektor kann etwas wie Nord, Sonne, Lichtquelle, Beobachter usw. sein. Er muss nicht parallel zur Tangente sein. Um es zu vermeiden, habe ich normalerweise 2 solche Vektoren und wähle die, die kleinere Punktprodukt hat ... – Spektre

+0

Danke, Ihr Kommentar klärt ein paar Dinge für mich, besonders. Verwenden Sie zwei Vektoren und wählen Sie zwischen ihnen. – crobar