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

时间:2017-04-13 20:54:04

标签: matlab matlab-figure

我正在绘制一个三维点云,但是很难将图形旋转到某个姿势。

例如,

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');

默认视角是

Figure showing point cloud

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

Rotated Figure

我可以使用

将视图旋转到此位置
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)。我不知道该怎么做。

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

1 个答案:

答案 0 :(得分:3)

view可以选择使用cartisian方向[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

您应该看到以下结果:

enter image description here

享受!