我在3D空间中有线或轨迹。我也有2D形状。我想采用这种形状并沿曲线移动,保持曲面法线平行于曲线的切线。根据帖子here,我已经成功完成了这项工作,从而产生了一些“看起来正确”的内容。对于具有旋转对称性的形状,如圆形。有关示例,请参阅下面的代码和图。
% 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
请注意,此代码使用Matlab文件交换中的Shape Language Modelling函数来制作曲线并使其在各个点处相切,但这对问题并不重要。
但是,正如您所看到的,使用此方法在曲线中移动时,形状的旋转会翻转。我需要保持形状的旋转一致,因为我实际上希望从形状表面上的散射3D数据中采样值,该数据表示管的内部&#39;或者无论形状如何。
那么当我沿着曲线移动时,如何控制形状的方向?
答案 0 :(得分:0)
你需要2个向量和位置! tangent
(你拥有它)和一个矢量来对齐up
,它必须与切线不平行。然后构建3D变换矩阵使用切线作为Z-axis
并利用叉积来获得另外两个例如:
Up = (0,1,0)
Z = tangent/|tangent|
X = cross(Z,Up)
Y = cross(X,Z)
O = position
位置就是轨迹+/-形状偏移处的实际位置。您可以通过否定它们或通过更改叉积操作数顺序来调整X,Y,Z轴的符号,以获得所需形状的镜像。现在构建变换矩阵,参见:
现在只需使用此矩阵转换/渲染您的形状。