在Matlab中调整三维图的投影

qv7cva1a  于 2022-12-27  发布在  Matlab
关注(0)|答案(1)|浏览(755)

据我所知,Matlab没有现成的方法来调整3D图形的投影透视失真,因此,给出下面的代码:

figure;
x1 = rand(1,10);
x2 = rand(1,10);
x3 = rand(1,10);
scatter3(x1,x2,x3,80,'o','filled'); hold on
ax = gca;
ax.Projection='perspective';

结果并不令人印象深刻:

我尝试修改ax.CameraTargetax.CameraPosition等,但几乎不可能修改"消失点"以使其看起来更失真,例如:

关于如何实现对图形外观的这种级别的控制,有什么帮助吗?
谢谢!

zphenhs4

zphenhs41#

你可以通过进入“广角”模式来实现这一点,也就是说,选择一个大的CameraViewAngle,同时将相机进一步移向绘图。这会给你带来相当大的失真,就像你可能从广角相机镜头中看到的那样。
在下面的代码中,我假设摄像机放置在坐标系的中心z-水平,xy-坐标正好在坐标系的两个边缘点之间的连接线上位移,并按其长度向后移动。其余部分基本上是“余弦定律”。请在给定的可感知水平内自由调整摄像机位置,使得视角保持在0和180度之间的范围内,https://de.mathworks.com/help/matlab/ref/matlab.graphics.axis.axes-properties.html#budumk7-View)。该示例假定x-y平面中的视角与y-z平面中的视角大致相同。否则,需要扩展计算并取两者的平均或最大Angular 。

figure;
x1 = rand(1, 10) + 10;
x2 = rand(1, 10) + 15;
x3 = rand(1, 10) + 10;
scatter3(x1, x2, x3, 80, 'o', 'filled');

% get the axis limits
xax = xlim; yax = ylim; zax = zlim;

ax = gca;
ax.Projection = 'perspective';

% get the default camera target (where the cam looks at)
camTarget = get(ax, 'CameraTarget');

newCamPos = [ 2*xax(1)-xax(2) 2*yax(1)-yax(2) camTarget(3) ];
a = sqrt((xax(1)-newCamPos(1))^2 + (yax(2)-newCamPos(2))^2);
b = sqrt((xax(2)-newCamPos(1))^2 + (yax(1)-newCamPos(2))^2);
lsqr = (xax(2)-xax(1))^2 + (yax(2)-yax(1))^2;
angle = acos((lsqr - a^2 - b^2) / -(2*a*b)) *180/pi;

set(ax, 'CameraViewAngle', angle, ...
        'CameraPosition', newCamPos);

相关问题