如何将图形视点移动到 3d 位置,沿矢量观察?

How to move the figure viewpoint to a 3d position, looking along a vector?

我正在绘制 3d 点云,但很难将图形旋转成特定姿势。

例如,

figure; hold on;

z = linspace(0,3*pi,250);
x = 2*cos(z) + rand(1,250);
y = 2*sin(z) + rand(1,250);

plot3(x, y, z, 'b.', 'MarkerSize', 20);

plot3(x(1), y(1), z(1), 'kx', 'MarkerSize', 20);
plot3([x(1) x(end)], [y(1) y(end)], [z(1) z(end)], '-k');

默认视角是

我想从'X'位置沿着黑线看。我可以使用 GUI 控件手动旋转图形,我发现我最接近方位角 96 仰角 -46

我可以使用

将视图旋转到这个位置
view(96, -46);

但是,视点实际上并未位于 'X' 之上。 'X' 是视点前方的一段距离。此外,每次调用此代码时我都有不同的向量,因此我不能每次都使用相同的方位角和仰角。

我应该能够根据矢量计算出方位角和仰角。我的尝试,

x_dif = x(end)- x(1);
y_dif = y(end)-y(1);
z_dif = z(end)-z(1);

azimuth = (atan(x_dif/y_dif))*180/pi;
elevation = (atan(z_dif/sqrt(x_dif^2+y_dif^2)))*180/pi;
view(azimuth, elevation);

这产生了一个不正确的解决方案。我认为这可能是因为方位角和仰角应该是相对于绘图框的中心的。 (view documentation)。我不知道该怎么做。

如何计算给定矢量的图形并将其应用旋转?

view 可以选择使用笛卡尔方向 [x,y,z] 而不是 [alt,azi]

这对我有用:(请注意 axis equal 调用以避免默认 plot 轴缩放中的变形)

function cecilia()
    figure; hold on;

    z = linspace(0,3*pi,250);
    x = 2*cos(z) + rand(1,250);
    y = 2*sin(z) + rand(1,250);

    plot3(x, y, z, 'b.', 'MarkerSize', 20);

    plot3(x(1), y(1), z(1), 'kx', 'MarkerSize', 20);
    plot3([x(1) x(end)], [y(1) y(end)], [z(1) z(end)], '-k');

    x_dif = x(end)- x(1);
    y_dif = y(end)-y(1);
    z_dif = z(end)-z(1);

    view([x_dif,y_dif,z_dif]);
    axis equal
end

您应该会看到以下结果:

尽情享受吧!