如何将图形视点移动到 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
您应该会看到以下结果:
尽情享受吧!
我正在绘制 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
您应该会看到以下结果:
尽情享受吧!