
房产应用想用 3DGS 重建户型给用户云看房听起来很顺拍一段走动视频端侧出点云用户在手机里走进走出。真上手才发现户型是 3DGS 的重建黑洞——玻璃门重建成空洞、镜面墙出现重影、大白墙丢细节、长走廊景深不够。这篇文章记录一个两室一厅 68 平米户型的重建结果逐区域给失败 case 和质量评分并标注哪些有应对、哪些只能放弃。能力面3DGS 对材质的重建表现差异3DGS 用高斯点逼近真实场景每个点带颜色、透明度、位置、协方差。这套数据结构对不同材质的表现差异很大原因是采集阶段拿到的像素信息量不同漫反射表面如布艺沙发、木质家具各角度像素稳定重建质量最好。无纹理大色块如白墙、白顶像素信息少特征提取困难重建出来是平的但丢细节。透明表面如玻璃门、玻璃隔断背后物体透过来各角度像素完全不同重建算法无法收敛。高反光表面如镜面、抛光金属反射内容随相机位置变和透明一样不可收敛。弱纹理 重复纹理如条纹壁纸、木地板特征点重复匹配错出现重影。需要主动指出3DGS 无拓扑点云式数据不支持骨骼动画、形变动画编辑受限。这意味着重建失败的区域不能像 Mesh 那样手动补面修复——点云没有面的概念补出来的点和周围高斯点融合不了。失败的只能整片放弃或重采集。材质差异会一路传导到判定环节。下面把分区、判定、汇总串成一条判定链。漫反射白墙大色块透明玻璃镜面抛光金属重复纹理超阈值可接受扫描采集数据按材质分区材质分类纹理稳定判定纹理丢失判定重建失败判定反射重影判定高光过曝判定特征错配汇总可交付区域汇总失败区域失败面积占比采集期遮挡或补拍整片放弃或接受每个分支的阈值都来自前面那张失败边界表不是拍脑袋定的。约束面失败边界在哪里材质类型重建表现失败边界能否应对漫反射布艺、木纹质量好SSIM 0.85无直接用无纹理白墙平面正确丢纹理细节墙面颜色均匀时基本不可见可接受透明玻璃重建成空洞或半透错乱背后物体复杂时必失败改采集或放弃镜面出现重影反射内容被当真实重建镜面占视场 20% 时严重遮挡采集抛光金属高光过曝区域色块丢失强光源下必失败打光改善重复纹理壁纸特征匹配错位墙面扭曲重复周期 5cm 时易错加特征点透明和镜面是两条硬失败边界目前 API 26 的 ReconSession 没有材质感知能力不能自动识别这是玻璃所以跳过。失败表现是重建出来看着对、走近看是错的比直接报错更坑——用户以为成功了到现场发现完全不是那回事。场景落地两室一厅 68 平米逐区域重建被测户型两室一厅一卫68 平米层高 2.7 米。客厅 18 平米有玻璃推拉门通阳台、电视背景墙是镜面装饰条主卧 14 平米有大衣柜镜面门次卧 10 平米纯漫反射是对照组卫生间 5 平米有玻璃淋浴隔断厨房 7 平米有抛光不锈钢冰箱面板。采集设备 Pura 80 Pro按房间分块走动拍摄每间独立重建。重建后逐区域人工评分5 分制3 分以下不可交付。区域主要材质重建评分失败表现次卧整体布艺床 木地板 白墙4.5无明显问题客厅沙发区布艺 茶几木纹4.2沙发缝处轻微丢细节客厅玻璃推拉门透明玻璃1.5门体重建成空洞阳台景物穿透客厅镜面装饰条镜面2.0反射的沙发被当真实重建出现重影主卧床区漫反射为主4.0床头柜高光轻微过曝主卧大衣柜镜面门镜面1.8镜面里反射的床被重建开门动画位置错乱卫生间淋浴隔断透明玻璃1.2玻璃完全丢失隔断位置空洞厨房冰箱面板抛光不锈钢2.5高光过曝区色块丢失指纹可见走廊白墙无纹理大色块3.8平面正确墙漆颗粒纹理丢失走廊木地板重复纹理3.5远处地板纹理扭曲特征匹配错10 个区域里 5 个评分 ≥ 3.8 可交付5 个 ≤ 2.5 不可交付。失败区域按面积占约 22%但按用户走动时视场命中失败区的频率占更高——玻璃推拉门和镜面都在客厅主视野用户一进客厅就撞上。真机数据各区域重建耗时与体量区域重建耗时输出点数PLY 体量次卧 10 平米38 秒52 万14 MB客厅 18 平米71 秒130 万31 MB主卧 14 平米55 秒88 万21 MB卫生间 5 平米22 秒28 万7 MB厨房 7 平米31 秒41 万10 MB走廊 4 平米18 秒19 万5 MB客厅耗时 71 秒最长原因是玻璃推拉门和镜面让重建算法反复迭代无法收敛最后是达到最大迭代次数退出而非自然收敛。这种非自然收敛的重建结果看着像那么回事实际是算法放弃挣扎的产物评分自然低。需要主动指出同一时刻只允许一个重建 session。6 个房间串行重建总耗时约 4 分钟加上 session 释放间隔和走动换房间的时间部署期一个户型全量重建约 8-10 分钟。踩坑与应对判定逻辑落到代码就是一个按材质分桶的统计函数。// 按材质分区统计重建失败率 // 评分 5 分制各材质交付阈值不同玻璃/镜面是硬边界 type MaterialKind | GlassWall // 透明玻璃 | MirrorWall // 镜面 | WhiteWall // 无纹理白墙 | Diffuse // 漫反射 | PolishedMetal // 抛光金属 | RepeatTexture; // 重复纹理 interface MaterialZone { kind: MaterialKind; score: number; // 该区域人工重建评分5 分制 areaRatio: number; // 该区域占户型面积比例0-1 } interface FailStat { kind: MaterialKind; failRatio: number; // 该材质下不合格面积占其总面积比例 zoneCount: number; // 该材质分区数量 } // 各材质交付阈值玻璃/镜面低分即失败漫反射要求最高 const DELIVER_THRESHOLD new MapMaterialKind, number(); DELIVER_THRESHOLD.set(GlassWall, 3.0); // 玻璃重建成空洞低于 3 分不可交付 DELIVER_THRESHOLD.set(MirrorWall, 3.0); // 镜面重影同样不可交付 DELIVER_THRESHOLD.set(WhiteWall, 3.0); // 白墙丢细节可接受3 分线放宽理解 DELIVER_THRESHOLD.set(Diffuse, 4.0); // 漫反射要求高低于 4 分算异常 DELIVER_THRESHOLD.set(PolishedMetal, 3.0); // 高光过曝部分接受 DELIVER_THRESHOLD.set(RepeatTexture, 3.5); // 重复纹理扭曲3.5 分以下算失败 // 输入材质区域列表输出各材质的失败占比 function calcFailRatio(zones: MaterialZone[]): FailStat[] { const bucket new MapMaterialKind, { failArea: number; totalArea: number; count: number }(); for (const zone of zones) { const cur bucket.get(zone.kind) ?? { failArea: 0, totalArea: 0, count: 0 }; const threshold DELIVER_THRESHOLD.get(zone.kind) ?? 3.0; const isFail zone.score threshold; cur.totalArea zone.areaRatio; if (isFail) { cur.failArea zone.areaRatio; } cur.count 1; bucket.set(zone.kind, cur); } const result: FailStat[] []; bucket.forEach((v, kind) { result.push({ kind: kind, failRatio: v.totalArea 0 ? v.failArea / v.totalArea : 0, zoneCount: v.count }); }); return result; } // 用法传入逐区域评分输出各材质失败占比 const zones: MaterialZone[] [ { kind: Diffuse, score: 4.5, areaRatio: 0.30 }, { kind: GlassWall, score: 1.5, areaRatio: 0.04 }, { kind: MirrorWall, score: 2.0, areaRatio: 0.05 }, { kind: WhiteWall, score: 3.8, areaRatio: 0.35 } ]; console.info(fail stats:, JSON.stringify(calcFailRatio(zones)));跑完输出每类材质的失败占比能直接对照文中 22% 这个总数。坑 1玻璃门重建成空洞客厅通阳台的玻璃推拉门重建后门的位置变成空洞阳台上的盆栽直接穿透到客厅里。原因是玻璃透明相机从客厅侧拍过去拿到的是阳台景物像素从阳台侧拍拿到的是客厅景物像素两组像素描述的同一个空间位置完全不同高斯点无法收敛。应对方案试过三种方案做法效果直接重建不处理空洞不可用采集时贴磨砂膜临时给玻璃贴一层磨砂贴膜再拍玻璃重建成功但部署期要人工贴膜采集时拉窗帘把玻璃后面的窗帘拉上挡住透视玻璃丢失但墙体连续可接受最终房产项目选拉窗帘——部署期采集者顺手拉一下窗帘比贴膜省事。代价是户型里没有通阳台看出去这个视野但房产看房本来也不强调这个。如果是商品橱窗展示磨砂膜方案更合适。坑 2镜面出现重影主卧大衣柜镜面门重建后镜面位置出现重影镜面里反射的床被当真实物体重建出来和真实的床叠在一起相机移动时两层错位晃动。原因是镜面反射的内容随相机位置变化重建算法把反射的床当成镜面后面真的有床。这个坑比玻璃更难处理因为镜面看着是有内容的不像玻璃那样明显空洞。应对只有一招采集时用不透明布遮挡镜面。我们试过让算法识别镜面跳过API 26 没有这个能力。也试过重建后手动删镜面区域的点云但删完露出后面反射重建的床更怪。遮挡采集是唯一可靠方案部署期多带一块遮光布。坑 3白墙大面积色块丢失细节走廊白墙重建出来平面是对的但墙漆的颗粒纹理、刷痕细节全丢变成纯色块。原因是白墙像素信息太少特征提取拿不到足够匹配点。这个坑可以接受。房产看房用户不会凑到墙上看刷痕白墙是纯色块不影响走进去看看格局的体验。我们一度想给白墙区域叠加一张实拍贴图增强细节后来放弃了——工程量不小用户感知收益很低。坑 4抛光不锈钢高光过曝厨房冰箱面板抛光不锈钢在顶灯照射下高光过曝重建后过曝区变成纯白块连冰箱把手都看不清。应对是采集时关掉顶灯用漫射补光。但户型采集是走动拍摄不可能每个房间调一次光。最终厨房区域接受 2.5 分评分房产看房里厨房不是主卖点凑合用。坑 5重复纹理地板远处扭曲走廊木地板纹理重复周期约 4cm重建后远处地板纹理扭曲看起来像水波纹。原因是特征点在重复纹理上匹配错位把远处地板匹配到了近处。应对是采集时多角度覆盖让远处地板也有足够视差。这次走廊只走了单程远处地板视差不够。改成来回走两趟后远处扭曲减轻但没完全消除。重复周期 5cm 的纹理是 3DGS 的弱项目前没有完美方案。失败 case 汇总与决策失败 case根因应对决策玻璃门空洞透明物体不可收敛拉窗帘采集期处理镜面重影反射被当真实遮挡采集采集期处理白墙丢细节像素信息不足不处理可接受不锈钢过曝高光过曝漫射补光部分接受地板扭曲重复纹理误匹配多角度采集部分缓解5 个失败 case 里2 个必须采集期处理玻璃、镜面2 个只能部分缓解不锈钢、地板1 个直接接受白墙。3DGS 户型重建目前不能拍完就完采集者要懂材质、带遮挡工具。这条对房产项目的部署流程影响很大——不能像全景图那样随便找个中介拍得培训。透明玻璃和镜面是硬失败边界采集期必须遮挡处理白墙丢细节可接受不必补偿重复纹理周期 5cm 的地板多角度采集单程不够抛光金属高光区采集期漫射补光否则过曝session 单例多房间串行重建重建失败区域不能手动补点修复3DGS 无拓扑只能整片放弃或重采集仅保证机型开放房产项目建议直接白名单测试哦测一组 10 个不同户型统计玻璃 镜面 不锈钢的失败面积占比分布确认 22% 这个数是否有代表性试采集期给玻璃贴磨砂膜方案在 5 个户型上的部署成本对比拉窗帘方案的用户感知差异调研 API 26 后续版本是否会加材质感知如果加了对玻璃/镜面可自动跳过能省掉遮挡采集对比 3DGS 户型重建和传统全景看房如贝壳如视的用户体验看 3DGS 的视差优势是否值这 22% 失败面积在我们测的这一个户型里3DGS 重建能覆盖 78% 面积但客厅主视野的玻璃和镜面让首屏体验就崩了。遮挡采集后能交付但采集者要培训、要带工具部署成本比全景图高一个量级。如果房产项目只追求走进去看格局全景图可能更划算如果要看真实材质和光影3DGS 才有不可替代性。这个取舍得产品侧拍板技术侧给不了答案。