簡體   English   中英

如何刪除3D Matlab圖的背面

[英]How can I remove the back faces of a 3D matlab plot

在Matlab中繪制3D圖形時,邊界框的背面用白色填充:

在此處輸入圖片說明

這些可以很容易地全部刪除

ax = gca;
ax.Color = [0, 0, 0, 0];

我怎樣才能只取下背面? (除了地板上的所有東西)

使用未記錄的Axes.Backdrop屬性,您可以得到這種行為。 Axes.Backdrop.Face.VertexData包含背景頂點的列表。 我們可以找到並保持地板:

ax = gca;
face = ax.Backdrop.Face;

% can be replaced with conditions on other axes and limits
point_on_face = face.VertexData(3,:) == ax.ZLim(1);
is_target_face = all(reshape(point_on_face, 4, []));
target_face_verts = logical(kron(is_target_face, ones(1, 4)));

% discard all but the first quad (the floor)
face.VertexData = face.VertexData(:,target_face_verts);

但是,當軸旋轉時,將重新繪制這些四邊形,這不是有效的解決方案。

我們可以通過添加事件監聽器來進一步:

function h = set_walls(ax, varargin)
  function update()
    face = ax.Backdrop.Face;
    data = face.VertexData;
    if empty(data); return; end
    keep_verts = false(1, size(data, 2));
    for side = varargin'
      side = side{:};
      switch side
        case 'xmin'; point_on_face = data(1,:) == ax.XLim(1);
        case 'xmax'; point_on_face = data(1,:) == ax.XLim(2);
        case 'ymin'; point_on_face = data(2,:) == ax.YLim(1);
        case 'ymax'; point_on_face = data(2,:) == ax.YLim(2);
        case 'zmin'; point_on_face = data(3,:) == ax.ZLim(1);
        case 'zmax'; point_on_face = data(3,:) == ax.ZLim(2);
        otherwise; error('Unknown face');
      end
      is_target_face = all(reshape(point_on_face, 4, []));
      keep_verts = keep_verts | logical(kron(is_target_face, ones(1, 4)));
    end
    face.VertexData = data(:,keep_verts);
  end
  h = addlistener(ax, 'MarkedClean', @(x, y) update);
end

這會閃爍,但可以。 該函數可用作set_walls(gca, 'zmin')

移除背景

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM