【问题标题】:project 3D plot to 2D screen plane将 3D 绘图投影到 2D 屏幕平面
【发布时间】:2015-10-12 20:49:23
【问题描述】:

我在 Matlab 中有以下内容(解决方案如 http://uk.mathworks.com/help/matlab/ref/viewmtx.html 中的示例):

subplot(211)
h = ezplot3('cos(t)', 'sin(t)', 'sin(5*t)', [-pi pi]);
data = get(h,{'XData','YData','Zdata'});
data = [cat(1,data{:})', ones(numel(data{1}),1)];

% Projection matrix on screen
[az,el] = view(); A = viewmtx(az,el);
data_transformed = A*data';

subplot(212)
plot(data_transformed(1,:), data_transformed(2,:))

该转换不适用于:

h = ezplot3('t', 'sin(t)', '20*cos(t)', [0 10*pi]);

如何获得第三个情节的屏幕投影?

此外,任何指向投影背后的数学的链接,带有示例也很好:)

【问题讨论】:

  • 第四个图不就是第三个图的[x,z]平面的视图吗?
  • @Adriaan 不应该。第一个绘图应用相同的变换矩阵并获得屏幕投影(或者这是我认为的)。
  • 我认为他们应该这样做。据我所知,您并没有改变绘制的函数,只是改变了它的观察角度。第二个图像再次只是第一个图像的 [x,z] 平面视图。您可以手动执行此操作(单击绘图上的“旋转”图标),但此代码显然会为您旋转绘图
  • 嗯,我需要第三个情节的屏幕投影(二维)。

标签: matlab 3d 2d projection


【解决方案1】:

投影取决于view。如果您尝试使用各种 view 值,则 2D 项目会产生不同的结果。

例如,[az,el]=view(60,30);,您将拥有此投影。

[az,el]=view(30,15);你会得到这张图片

【讨论】:

  • 我改变了这个问题,因为它以前没有传达我想要的东西。因此,您的回答虽然是上下文相关的,但并不能解决我的问题。很抱歉给您带来不便。
【解决方案2】:

原来你需要通过DataAspectRatio进行归一化,所以viewTransform矩阵变成了:

[az, el] = view(gca);
A = viewmtx(az,el) * makehgtform('scale',1./get(gca,'DataAspectRatio'));

完整答案可见http://uk.mathworks.com/matlabcentral/answers/248362-screen-2d-projection-of-3d-plot

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2023-03-08
    相关资源
    最近更新 更多