matlab - 如何使 3D 轴大小超出图形
matlab - how to make 3D axes size go outside of figure
我首先创建了一个背景为 .png 图像的图形。然后我在图的顶部创建了一个 3D 轴,以便将 3D 轴放置在 .png 图像的顶部。请注意,.png 图像未设置在 3D 轴内,而是设置在图本身的轴外。
我有一个苹果的 3D .stl 文件设置在 3D 轴内(顺便说一句,你看不到苹果)。当我使用内置 Matlab 图工具栏中的选项在 3D 轴内移动苹果时,它工作正常。但是这里的问题是,当我将苹果移到 3D 轴的边界之外时,它就消失了。
为了解决这个问题,我想设置 3D 轴的大小,使其限制在图形之外,这样我就可以在图形的任何地方移动我的苹果,而不受限于3D 轴。注意:我没有让 3D 轴不可见,这样人们更容易理解我的问题。但是当这个问题解决后,我将使用 axis off
使 3D 轴不可见,同时保留并显示苹果。
这里是主要代码
pearImage = 'pears.png';
appleModel = 'apple.stl';
backgroundImage = imread(pearImage);
[vertices,faces,~] = stlRead(appleModel);
axesHandle = axes('unit','normalized','position',[0 0 1 1]);
imagesc(backgroundImage)
set(axesHandle,'handlevisibility','off','visible','off')
uistack(axesHandle,'bottom')
stlPlot(vertices,faces)
这是stlPlot()
的函数
function stlPlot(vertices,faces)
object.vertices = vertices;
object.faces = faces;
patch(object,'FaceColor',[0.1 1.0 1.0],'EdgeColor','none')
camlight('headlight')
material('dull')
axis('image')
view([-135 35])
axis off % used to make the 3D axes invisible
我从这里获得了 stlRead()
和 stlPlot()
函数:https://kr.mathworks.com/matlabcentral/fileexchange/22409-stl-file-reader?focused=5193625&tab=function。请注意,我编辑了 stlPlot()
函数以满足我的目的。
我相信你可以通过更改你创建的 'Clipping'
property of the patch objects 来解决这个问题:
hPatch = patch(object, 'FaceColor', [0.1 1.0 1.0], 'EdgeColor', 'none', 'Clipping', 'off');
或者,更简单地说,您可以只设置 'Clipping'
property of the parent axes object 本身(它控制其所有子项的剪裁行为):
set(get(hPatch, 'Parent'), 'Clipping', 'off');
我首先创建了一个背景为 .png 图像的图形。然后我在图的顶部创建了一个 3D 轴,以便将 3D 轴放置在 .png 图像的顶部。请注意,.png 图像未设置在 3D 轴内,而是设置在图本身的轴外。
我有一个苹果的 3D .stl 文件设置在 3D 轴内(顺便说一句,你看不到苹果)。当我使用内置 Matlab 图工具栏中的选项在 3D 轴内移动苹果时,它工作正常。但是这里的问题是,当我将苹果移到 3D 轴的边界之外时,它就消失了。
为了解决这个问题,我想设置 3D 轴的大小,使其限制在图形之外,这样我就可以在图形的任何地方移动我的苹果,而不受限于3D 轴。注意:我没有让 3D 轴不可见,这样人们更容易理解我的问题。但是当这个问题解决后,我将使用 axis off
使 3D 轴不可见,同时保留并显示苹果。
pearImage = 'pears.png';
appleModel = 'apple.stl';
backgroundImage = imread(pearImage);
[vertices,faces,~] = stlRead(appleModel);
axesHandle = axes('unit','normalized','position',[0 0 1 1]);
imagesc(backgroundImage)
set(axesHandle,'handlevisibility','off','visible','off')
uistack(axesHandle,'bottom')
stlPlot(vertices,faces)
这是stlPlot()
function stlPlot(vertices,faces)
object.vertices = vertices;
object.faces = faces;
patch(object,'FaceColor',[0.1 1.0 1.0],'EdgeColor','none')
camlight('headlight')
material('dull')
axis('image')
view([-135 35])
axis off % used to make the 3D axes invisible
我从这里获得了 stlRead()
和 stlPlot()
函数:https://kr.mathworks.com/matlabcentral/fileexchange/22409-stl-file-reader?focused=5193625&tab=function。请注意,我编辑了 stlPlot()
函数以满足我的目的。
我相信你可以通过更改你创建的 'Clipping'
property of the patch objects 来解决这个问题:
hPatch = patch(object, 'FaceColor', [0.1 1.0 1.0], 'EdgeColor', 'none', 'Clipping', 'off');
或者,更简单地说,您可以只设置 'Clipping'
property of the parent axes object 本身(它控制其所有子项的剪裁行为):
set(get(hPatch, 'Parent'), 'Clipping', 'off');