恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
【共创稿事节】HarmonyOS 7透明/半透明物体重建的失败边界
首页
资讯中心
/
【共创稿事节】HarmonyOS 7透明/半透明物体重建的失败边界
【共创稿事节】HarmonyOS 7透明/半透明物体重建的失败边界
发布时间:2026/10/8 18:37:19
玻璃杯、塑料瓶、水晶摆件这类透明物体3DGS 重建基本废掉。我们团队做商品展示项目时把一只高脚杯拍进去重建出来的东西像冰柱——实心的没有折射没有透光。折腾一周后我们承认3DGS 在透明物体这件事上目前有明确的失败边界。这篇文章记录我们测过的边界在哪以及哪些情况下可以放弃挣扎直接换方案。能力面高斯点 alpha 混合表达不了折射3DGS 的渲染原理是每个高斯点带一个 alpha 值投影到屏幕后按深度做 alpha 混合叠加。这个模型能表达半透明——比如烟雾、毛玻璃那种把背景糊掉的效果。但它表达不了折射——光线穿过玻璃改变方向、把背后的景物扭曲重组成像的过程。折射需要知道入射角、折射率、介质厚度然后做光线追踪或至少是屏幕空间的折射近似。3DGS 没有这一层。每个高斯点只管我在这个位置、这个颜色、这个透明度不管光线怎么走。所以透明物体在 3DGS 里只能被表达成一团有颜色的半透明体积而不是一个会折射光线的实心介质。我一开始以为加大采集密度、多拍几圈能救回来。后来发现不行——重建算法本身就不建模折射给再多数据也拟合不出折射路径只会把那块区域填成更密的半透明点云看起来像脏玻璃。团队里有人提议换一组重建参数试试调了几版发现 SSIM 变化在 0.02 以内属于噪声范围放弃。Spatial Recon Kit 在 API 26 暴露的重建接口里没有折射相关的参数或开关。我们翻过文档和头文件确认目前版本不提供任何折射建模能力。这意味着透明物体的失败不是配置问题是能力缺失。// ArkTS当前重建 API 没有任何折射/透明度相关的参数import{spatialRecon}fromkit.SpatialReconKit;constsessionawaitspatialRecon.createReconSession({inputUri:file:///data/capture/glass.mp4,outputDir:file:///data/output/glass/,// 没有 refractionEnabled、transparencyMode 之类的参数// 重建算法对透明物体的处理是固定的});约束面透明度阈值与失败临界我们把透明度分成三档测高透玻璃杯可见光透射率约 92%、半透塑料瓶约 70%、低透磨砂玻璃约 40%。重建质量用 SSIM 跟原始采集帧对比主观评分由 3 个人独立打分取平均。拍摄条件统一环绕 360°每 3° 一帧共 120 帧室内均匀光照。物体透射率重建高斯点数重建耗时SSIM主观评分(1-10)失败区域占比玻璃杯92%18.7 万11.2s0.412.368%塑料瓶透明款70%24.3 万13.8s0.584.145%磨砂玻璃杯40%31.2 万15.6s0.726.422%实心陶瓷杯对照0%27.8 万14.1s0.898.75%数据是我们 3 台麒麟 9030 设备跑出来的每台跑 3 次取中位数。SSIM 波动大概 ±0.03主观评分人与人之间差 1 分以内。重建耗时波动更大一些±1.5s跟当时后台负载有关。透射率高于 70% 的物体重建质量基本不可用。玻璃杯那行 SSIM 0.41 是什么概念——比直接拿一张采集图模糊处理后比较还低说明重建结果跟原始物体已经不像了。失败区域占比 68% 意味着杯身大部分区域是错的。磨砂玻璃反而是三者里最救得回来的一种。原因也好理解磨砂表面把光线散射掉折射信息本来就被破坏了3DGS 用半透明体积去近似反而歪打正着。但边缘——杯口、杯底这些曲率变化大的地方——依然会糊掉因为没有折射信息来约束边缘的几何。我们还测了一个中间态半磨砂玻璃杯一面磨砂一面透明。结果很有意思——磨砂那面 SSIM 0.69透明那面 SSIM 0.43跟单独测的两个案例接近。这说明透明度的影响是局部的不是整体重建质量一刀切。这个发现后来影响了我们的产品策略如果物体局部透明可以接受重建把透明区域做特殊处理。场景落地三种透明度物体的重建对比我们拍了三组对比素材同一光照、同一背景、同一拍摄路径分别重建后加载到端侧渲染。玻璃杯重建成实心玻璃杯重建出来杯身变成一坨带轻微透明度的实心体积。从侧面看背后物体的折射完全丢失——杯子里插的花看不到本来应该透过玻璃看到花茎被折射拉弯现在花茎直接消失因为重建算法把那块区域当成杯壁本身的颜色。更糟的是杯口边缘。薄壁在高斯点里被表达成一条半透明的带没有厚度信息。渲染时从某些角度看杯口像被削平了一块。我们截图给非技术的产品同学看他以为是杯子被压扁了。失败区域主要集中在两类地方薄壁区域杯壁、杯口和折射强烈的区域杯身中部因为这里光线路径最复杂。这两类区域加起来占杯身投影面积的 68%跟表格里的失败区域占比对得上。塑料瓶瓶身可用瓶口翻车透明塑料瓶矿泉水瓶那种情况好一些。瓶身曲面重建基本正确因为塑料的折射率比玻璃低PET 约 1.57玻璃约 1.52但塑料壁更薄折射扭曲没那么剧烈。但瓶口螺纹处翻车——那是薄壁加高曲率重建出来的螺纹糊成一团看不清结构。塑料瓶还有一个问题是反光。塑料表面有高光3DGS 会把高光烧进点云里导致从其他角度看时那个高光还在原位像贴了一块白斑。这不是透明物体特有的问题但在透明物体上特别明显因为背景信息本来就少高光一占就更没有可用信息了。我们试过在采集时加偏振片消反光效果有改善但没根治。偏振片只能消除某个角度的反光环绕拍摄时总有角度消不掉。而且加偏振片后进光量下降弱光噪声上来重建质量又掉。两头不讨好最后放弃。磨砂玻璃勉强可用边缘糊掉磨砂玻璃杯是三者里效果最好的。杯身半透明效果接近真实因为磨砂的本质就是打散折射3DGS 的半透明体积模型正好对路。但杯口边缘依然糊。磨砂玻璃杯口通常有一圈抛光带不磨砂的透明边缘这圈抛光带的折射信息丢失重建后变成一段模糊的过渡没有清晰的边界。我们试过一个取巧办法把磨砂玻璃杯口用不透明胶带贴住再重建重建后把胶带区域的高斯点删掉用周围点外推补齐。效果比直接重建好一点但补齐的区域颜色偏暗因为外推用的是磨砂区域的颜色没有透明边缘的亮度。这个方案最后放弃了工程上不划算——用户不会为了重建一个杯子先贴胶带。踩坑与取舍坑 1玻璃杯重建成实心用户以为模型错了产品同学第一次看到玻璃杯重建结果以为是重建 bug让我们修一下。解释了半天这是 3DGS 的原理局限不是 bug。后来我们达成共识透明物体在产品层面要么不重建要么重建后明确标注非真实折射。这个沟通成本不小。建议在做产品方案阶段就把透明物体的能力边界跟产品对齐别等到验收阶段才解释为什么玻璃杯不像玻璃杯。坑 2增加采集帧数没用我们试过把玻璃杯的采集帧数从 120 帧加到 360 帧重建耗时从 11 秒涨到 28 秒SSIM 只从 0.41 涨到 0.43。投入产出比极差。原因前面说过算法本身不建模折射给再多数据也拟合不出来。这个坑我们踩了两天才想明白。一开始以为是采集路径不够覆盖加了顶部和底部的帧又加了近距离特写帧全没用。后来去翻 3DGS 原始论文才确认算法的渲染模型里就没有折射项这不是数据量能解决的问题。坑 3背景复杂度影响重建同一个玻璃杯放在纯白背景前重建 SSIM 0.41放在杂乱桌面前重建 SSIM 0.38。背景越复杂杯身区域要表达的折射信息越多重建越崩。这个发现让我们调整了采集规范透明物体如果实在要重建背景尽量干净。但干净背景又带来另一个问题——特征点稀疏重建算法在背景区域找不到匹配点相机位姿估计精度下降。我们的折中方案是用带纹理但低对比度的背景比如浅灰色带细网格的布既有特征点又不会让折射信息太复杂。坑 4透明液体让事情更糟装了水的玻璃杯是最让我们头疼的 case。本来以为水会降低整体透明度水有颜色能救回来一点。结果水面本身是高反射加高折射的界面重建直接把水面丢了杯子上方出现一个空洞。这个 case 后来成了我们内部的3DGS 透明物体能力测试标杆每次参数调整都拿它跑一遍。目前没有好的解决方案含液面的透明容器在我们的产品里直接走传统建模。取舍什么时候放弃 3DGS 改用传统建模我们的判断是透射率大于 60% 的物体别用 3DGS直接上传统建模或者干脆用采集图做展示。透射率 40% 到 60% 可以试但要接受边缘糊。透射率小于 40% 基本可用按普通物体处理。这个阈值是我们测出来的不是算法理论给的换一套重建参数可能变。但在我们当前项目参数下这个阈值稳定复现。如果后续 Spatial Recon Kit 更新了折射建模能力这个阈值要重新测。整个判断其实不是单一阈值而是一条先看材质、再看透射率的链路画出来更清楚不透明透明高于 70%40% 到 60%低于 40%采集帧输入目标区域是否透明走正常重建流程透射率对比门限直接拒绝重建可尝试, 接受边缘糊磨砂类半透明换传统建模或照片展示重建后标注非真实折射先判材质决定要不要往下走透明物体再按透射率分流这样就不用把算力花在注定失败的 case 上。失败案例对比表物体透射率重建结果描述主要失败原因可否补救补救方案高脚杯薄壁高透92%实心冰柱状无折射折射未建模否改用传统建模水晶摆件多面体高透95%完全失败重建成一团折射加多面反射否改用传统建模矿泉水瓶薄壁半透70%瓶身可用瓶口螺纹糊薄壁高曲率部分瓶口单独建模替换半透明亚克力板平面半透55%勉强可用颜色偏移折射近似误差部分后期调色磨砂玻璃杯半透散射40%杯身可用杯口边缘糊抛光带折射丢失部分接受或建模补边缘装满水的玻璃杯混合杯身可用水面缺失液面反射加折射否改用传统建模实心陶瓷杯对照0%正常无——水晶摆件那行值得单独说一句。多面体水晶每个面都是高透加高折射还会互相反射重建结果比玻璃杯还崩——直接缩成一团没有形状的点云。这个 case 让我们确认了一件事3DGS 透明物体的失败程度跟面体复杂度正相关不是简单的透射率单变量问题。透明度检测重建前的预判既然透明物体重建大概率失败最好在重建前就预判一下避免浪费 10 秒重建时间。我们用了一个简单的方法分析采集帧中目标区域的亮度方差。透明区域的特点是背景透过来亮度方差跟背景一致不透明区域反映物体表面亮度方差不同。通过比较目标区域和背景区域的亮度方差比可以粗略判断透明度。// ArkTS基于亮度方差的透明度粗判functionestimateTransparency(frames:image.PixelMap[],targetRegion:Rect,backgroundRegion:Rect):number{lettargetVariances:number[][];letbackgroundVariances:number[][];for(constframeofframes){consttargetVarcomputeLuminanceVariance(frame,targetRegion);constbgVarcomputeLuminanceVariance(frame,backgroundRegion);targetVariances.push(targetVar);backgroundVariances.push(bgVar);}// 透明区域方差比接近 1不透明区域方差比偏离 1constavgRatiotargetVariances.reduce((sum,v,i)sumv/Math.max(backgroundVariances[i],1),0)/frames.length;// 方差比越接近 1透明度越高粗估constestimatedTransparencyMath.min(1,Math.max(0,avgRatio));returnestimatedTransparency;}// 用法透射率 0.6 直接跳过重建提示用户换方案consttransparencyestimateTransparency(captureFrames,targetRect,bgRect);if(transparency0.6){showHint(该物体透明度过高3DGS 重建效果不佳建议使用照片展示);return;}这个方法不精确误差大概 ±15%。但对要不要重建这个决策来说够了——我们只需要区分明显透明和基本不透明不需要精确透射率。误判的情况主要发生在低对比度物体上比如浅色磨砂玻璃方差比跟背景接近但实际透明度不高。这种 case 误判成透明跳过重建损失不大因为浅色磨砂玻璃重建效果也一般。总结一下下透射率大于 60% 的物体不走 3DGS 重建直接切传统建模或图像展示透明物体重建时背景尽量干净但要有低对比度纹理保证特征点增加采集帧数对透明物体收益极低不要在这上面花时间磨砂类半透明物体可用但要在产品层面接受边缘模糊含液面的透明容器杯子装水、花瓶装水目前不可重建重建结果若用于商品展示透明物体要标注非真实折射避免用户误解重建前做透明度预判避免浪费重建算力Spatial Recon Kit 当前版本无折射建模参数不要期待调参能救回来我们正在试一个混合方案透明物体的几何用传统建模一个简单的玻璃杯 mesh 很便宜表面纹理和光影用 3DGS 采集。mesh 提供折射所需的几何3DGS 提供表面外观。这个方案还没跑通主要卡在 mesh 和 3DGS 点云怎么对齐——mesh 的顶点和 3DGS 的高斯点没有天然对应关系手动对齐成本太高。如果有读者在做类似的事欢迎交流。另一个方向是等 Spatial Recon Kit 后续版本看会不会加折射建模能力——目前没有公开路线图但这是 3DGS 研究的活跃方向端侧跟上只是时间问题。在那之前透明物体在我们项目里就是 3DGS 的禁区。