如何在MATLAB中实现类似Plotly Volume的透明3D体可视化?
如何在MATLAB中实现类似Plotly Volume的体可视化效果
我希望在MATLAB中实现类似Plotly的Volume组件的体可视化效果。已尝试MATLAB官方文档中的多数方法,也试用了vol3d工具。
需求很明确:仅需一个整体高度透明的3D图,将数值进行局部分组并呈现为彩色“云状”,且支持turbo这类2D色图,无需严格追求精度(如抗锯齿)。
现有尝试的问题说明
以下是最接近目标的几种方法及其问题:
isosurface与isocaps:颜色映射错误,最大值显示为最小值,且内部过于空洞/透明。slice:若要颜色显示合理,alpha需设置过低;提高alpha则低数值区域会过度杂乱;alpha('color')对内部数值的透明度不足。vol3d:缺乏透明度,呈现出类似砖块的质感。
我尝试反转isosurface/isocaps的输入符号并偏移数值,会产生无法理解的变化,同时也无法理解文档中isovalue参数的定义。

代码
MATLAB 测试代码
OPTS = {'iso', 'slice', 'vol3d', 'slice-color'}; OPT = OPTS{1}; [X, Y, Z] = ndgrid(linspace(-8,8,40), linspace(-8,8,40), linspace(-8,8,40)); D = sin(X.*Y.*Z) ./ (X.*Y.*Z) * 100; D = max(min(D, 100), 20); % clip to [20, 100] figure colormap('turbo') % make cube xdim = size(X, 1); daspect([size(X,2)/xdim, 1, size(X,3)/xdim]) switch OPT case {'iso', 'vol3d'} view(3) axis tight camlight left camlight lighting gouraud if strcmp(OPT, 'iso') isosurface(D, 20) isocaps(D, 20) alpha(.5) else vol3d('CData', D); end case {'slice', 'slice-color'} g = linspace(-8,8,40); h = slice(g,g,g, D, g,g,g); set(h,'EdgeColor','none',... 'FaceColor','interp',... 'FaceAlpha','interp'); if strcmp(OPT, 'slice') alpha(.01) else alpha('color') end end
Python/Plotly 参考实现代码
import numpy as np import plotly.graph_objs as go import plotly.io as pio pio.renderers.default = 'browser' X, Y, Z = np.mgrid[-8:8:40j, -8:8:40j, -8:8:40j] V = np.sin(X*Y*Z) / (X*Y*Z) * 100 V = np.clip(V, 20, 100) vkw = dict(showscale=False, colorscale='turbo', surface_count=50, opacity=.2) fig = go.Figure(go.Volume(x=X.flatten(), y=Y.flatten(), z=Z.flatten(), value=V.flatten(), **vkw)) fig.show()
内容的提问来源于stack exchange,提问作者OverLordGoldDragon
相关产品推荐
相关产品推荐

