You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何平滑含单一中间值的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;

关键说明

  1. 平滑操作适配:smooth3会让密度值产生连续过渡,需为原始不同密度层级匹配合适阈值:
    • 原始密度1的区域平滑后集中在0.8-1区间,选0.9可精准捕获黑色实心区;
    • 原始0.5的区域平滑后集中在0.4-0.6区间,选0.5可锁定浅灰色中间区。
  2. 参数灵活调整:若平滑效果不足,可修改smooth3的平滑参数(如'box',2增强平滑);若区域区分度差,可微调等值面阈值适配平滑后的密度分布。

内容的提问来源于stack exchange,提问作者S B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:30:50