如何平滑含单一中间值的3D几何并区分不同密度区域?
问题与解决方案
原始代码
figure isovals = shiftdim(xPhys,2); isovals = smooth3(isovals,'box',1); patch(isosurface(isovals,0.8),'FaceColor',[0 0 1],'EdgeColor','none'); % 蓝色 patch(isocaps(isovals,0.8),'FaceColor',[1 0 0],'EdgeColor','none'); % 红色 view(3); axis equal tight off; camlight;
代码背景
上述代码可将原始3D密度矩阵几何(图1)转换为平滑后的等值面几何(图2)。其中变量xPhys是3D密度矩阵:元素为0代表立方体为空,1代表完全填充,两者间存在连续的中间密度等级。
现有场景与需求
我生成了仅含一个中间密度值(例如0.5,对应浅灰色区域)的几何(图3),黑色区域对应密度0或1。希望改写代码对该几何平滑处理的同时,区分浅灰色与黑色区域,但原代码会将所有区域显示为蓝色,无法区分。
实现方法
核心思路是针对不同密度阈值分别生成等值面,为每个区域设置独立颜色:
完整改写代码
figure % 预处理:维度调整+全局平滑 isovals = shiftdim(xPhys,2); isovals = smooth3(isovals,'box',1); % 生成黑色区域(原始密度0/1)的等值面 patch(isosurface(isovals,0.9),'FaceColor','k','EdgeColor','none'); patch(isocaps(isovals,0.9),'FaceColor','k','EdgeColor','none'); % 生成浅灰色中间区域(原始密度0.5)的等值面 patch(isosurface(isovals,0.5),'FaceColor',[0.7 0.7 0.7],'EdgeColor','none'); patch(isocaps(isovals,0.5),'FaceColor',[0.7 0.7 0.7],'EdgeColor','none'); % 视图与光照设置 view(3); axis equal tight off; camlight;
关键说明
- 平滑操作适配:
smooth3会让密度值产生连续过渡,需为原始不同密度层级匹配合适阈值:- 原始密度1的区域平滑后集中在0.8-1区间,选0.9可精准捕获黑色实心区;
- 原始0.5的区域平滑后集中在0.4-0.6区间,选0.5可锁定浅灰色中间区。
- 参数灵活调整:若平滑效果不足,可修改
smooth3的平滑参数(如'box',2增强平滑);若区域区分度差,可微调等值面阈值适配平滑后的密度分布。
内容的提问来源于stack exchange,提问作者S B
相关产品推荐
相关产品推荐

