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
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?
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
@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
Danke, Ihr Kommentar klärt ein paar Dinge für mich, besonders. Verwenden Sie zwei Vektoren und wählen Sie zwischen ihnen. – crobar