【问题标题】:Orienting 2D shape face with normal to 3D trajectory用法线到 3D 轨迹定向 2D 形状面
【发布时间】:2016-11-26 15:42:21
【问题描述】:

我在 3D 空间中有直线或轨迹。我也有一个二维形状。我想采用这种形状并沿着曲线移动它,保持曲面法线平行于曲线的切线。根据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 数据中采样值。

那么当我沿着曲线移动时,如何控制形状的方向?

【问题讨论】:

    标签: matlab vector 3d geometry


    【解决方案1】:

    您需要 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 轴的符号,以获得所需形状的镜像。现在要构造变换矩阵,请参见:

    现在只需使用此矩阵变换/渲染您的形状。

    【讨论】:

    • 谢谢,我正在努力完全理解您的答案,我想知道如何最好地选择Up。我也觉得可能Up 必须在轨迹上的每个点上进行更改?
    • @crobar 不,它没有......例如,up 可以是你的螺旋线的轴,轨迹正在摆动。交叉产品会自行为您进行对齐更改。这通常用于在航空应用和/或地面导航中获得NEH(东北高度)坐标系。参考矢量可以是北、太阳、光源、观察者等任何东西。它不能与切线平行。为了避免这种情况,我通常有 2 个这样的向量,并选择了具有较小点积的向量 ...
    • 谢谢,您的评论为我澄清了一些事情,尤其是。使用两个向量并在它们之间进行选择。
    • 玩过之后,我可能会补充一点,X、Y 和 Z 必须都是单位向量,否则您的点也是scaled,答案中没有明确说明。跨度>
    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多