我正在绘制一个三维点云,但是很难将图形旋转到某个姿势。
例如,
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控件手动旋转图形,我发现我最接近Azimuth 96 Elevation -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)。我不知道该怎么做。
如何计算并将旋转应用于给定矢量的图形?
答案 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
您应该看到以下结果:
享受!