【发布时间】:2014-12-03 15:48:16
【问题描述】:
问题
我正在尝试可视化 3-D 路径,以及它周围的“云”,它代表数据的标准偏差。我希望能够看到一条粗黑线作为路径,其周围有一个均匀的灰色区域,线条没有任何混浊,就好像看到这条线像 X 射线一样穿过云层。
尝试
我使用plot3 创建了一条粗线,并使用patch 创建了一系列围绕该线的每个点的框(图中还有一些额外的东西来表示开始/停止和方向,我也会喜欢他们很容易看到)。我尝试使用patch 中的alpha,但这会导致线条浑浊,因此无论视线中有多少灰色框,灰色的亮度都会发生变化。我希望alpha 为 1,这样每个灰色框的颜色都完全相同,但我希望找到某种方法可以使线条均匀地穿过云层。
最小示例
根据要求,这是一个最小的示例,它产生了下面的图。
% Create a path as an example (a circle in the x-y plane, with sinusoidal deviations in the z-axis)
t = 0:1/100:2*pi;
x = sin(t);y = cos(t);
z = cos(t).*sin(5*t);
figure;
plot3(x,y,z,'k','linewidth',7);
% Draw patches
cloud = .1*rand(size(t)); % The size of each box (make them random, "like" real data)
grayIntensity = .9; % Color of patch
faceAlpha = .15; % Alpha of patch
for i = 1:length(x)
patch([x(i) - cloud(i); x(i) + cloud(i); x(i) - cloud(i); x(i) + cloud(i); x(i) - cloud(i); x(i) + cloud(i); x(i) - cloud(i); x(i) + cloud(i)],... % X values
[y(i) - cloud(i); y(i) - cloud(i); y(i) + cloud(i); y(i) + cloud(i); y(i) - cloud(i); y(i) - cloud(i); y(i) + cloud(i); y(i) + cloud(i)],... % Y values
[z(i) + cloud(i); z(i) + cloud(i); z(i) + cloud(i); z(i) + cloud(i); z(i) - cloud(i); z(i) - cloud(i); z(i) - cloud(i); z(i) - cloud(i)],... % Z values
grayIntensity*ones(1,3),... % Color of patch
'faces', [1 2 4 3;5 6 8 7;1 2 6 5; 8 7 3 4;1 5 7 3;2 6 8 4],... % Connect vertices to form faces (a box)
'edgealpha',0,... % Make edges invisible (to get continuous cloud effect)
'facealpha',faceAlpha); % Set alpha of faces
end
对于 for 循环中非常长的代码段表示歉意,patch 命令有相当多的参数。前三行简单地定义了定义立方体的 8 个顶点的 x、y 和 z 坐标,方法是指定中心点加上或减去立方体的某个半宽 cloud(i)。其余的由各自的 cmets 解释。
感谢您的帮助!
【问题讨论】:
-
我认为(不确定)您可以使用 zbuffer 渲染模式来做到这一点。所以你
set(gca,'Renderer','zbuffer')首先绘制灰色的东西,然后是黑色的。我不确定它是否会起作用,但它可能...... -
我以前也有类似的问题。我通过只创建一个表面来解决它,代表你的云的包络(由沿中心线的所有圆盘/盒子定义)。那么你只有一个对象要管理,而且许多对象的 alpha 值不会加在一起,所以主中心线清晰可见。不过,您需要提供更多数据才能将其应用于您的案例。
-
@AnderBiguri,好主意。我尝试了您的解决方案,但它仅适用于 2D。在 3D 中,即使您将线条的句柄放在 uistack 的顶部(或最后绘制),渲染器也会检测到另一个对象(相对于相机)“后面”的线条部分并且不会渲染线条(在all) 对于这个隐藏的部分。
-
@Hoki 嗯,你是对的。我试图看看有一种方法可以禁用 Zbuffer,因为它可以在使用 openGL 时完成,但我找不到这样做的方法......
-
@Hoki 这是个好主意,但是尝试将我的“云”减少到单个表面可能会有些复杂。如果没有别的,我可以试试,不过,谢谢!