从拍照到显存读取——聊聊关于物体重建的尝试
miside吧
全部回复
仅看楼主
level 13
惠更斯X 楼主
在之前的尝试中,我们进行了通过高度图来对场景中物体进行测绘的实验;但显而易见的是,这种方式有很大的限制——得到的结果仅仅包含物体的上层数据,如果我们想要知道某一个物体哪里是可以穿过的空腔或者想要为这个物体创建一个稍微精确的碰撞体,这种方式是完全不可行的,而且如图这种边缘会出现非常锐利的直角;为此我们需要进行进一步的修改,代号SRL(Spatial Reconstruction Lab,空间重建实验室)
2026年08月23日 05点08分 1
level 13
惠更斯X 楼主
在正式开始介绍之前,需要申明鄙人并非专业开发者,所描述的内容可能存在错误或歧义。欢迎诸君斧正,或者且当图一乐;我们可以先用一句话说明SRL在做什么
SRL可以让游戏自己观察一个 3D 物体,从它的上、下、前、后、左、右和斜角等多个方向测量距离,再把这些测量结果合并起来,重新做出一个尽可能接近原物体形状的隐藏模型。
这个隐藏模型以后可以用来:让角色的手、脚、身体真正碰到物体;让角色抓住杯子、戒指等物体;让手指能够穿过戒指孔或杯把;避免角色碰到一个过于粗糙的方盒子后出现悬空、穿模或抖动;给原本没有精确碰撞体的游戏物体自动生成新的物理外壳。
可以理解为SRL让游戏里出现了一台“看不见的 3D 扫描仪”,它围着物体拍很多张只记录距离的照片,然后根据这些照片重新捏出一个数字模型。
2026年08月23日 05点08分 2
补充一点,即使我已经让GPT用最通俗易懂的方式进行表达,开发文档里面依旧包括非常多晦涩难懂的计算机图形学相关专业内容[黑线];楼主能够理解的比较有限所以有的东西可能描述的不是很清楚
2026年08月23日 07点08分
level 13
惠更斯X 楼主
先来认识一个最核心的组件TSDF,全名很长:Truncated Signed Distance Field可以翻译成:截断有符号距离场不需要记住英文,只需要理解两个词:1.“距离”每个体素节点都记录我离物体表面有多远?例如:a距离表面 2 厘米;b距离表面 5 毫米;c正好位于表面附近。2.“有符号”
这个距离不仅有大小,还有正负号。一般可以理解为:正数:在物体外面;负数:在物体里面;接近 0:在物体表面。因此,表面就在数字从正数变成负数的位置。最后只要找到“正负发生变化”的地方,就知道物体外壳大概在哪里。
用果冻解释 TSDF:想象物体被放进一大块透明果冻。果冻被切成很多小方块。每块果冻上写着:“我在杯子外面,离杯壁 4 毫米”;“我在杯子里面,离杯壁 2 毫米”;“我几乎就在杯壁上”。把所有小方块上的信息连起来,就形成了一个看不见的三维距离地图。
这个距离地图就是 TSDF。
2026年08月23日 05点08分 3
level 13
惠更斯X 楼主
多个方向怎样融合:
同一个位置可能被多张深度图观察到。
例如:正面摄像机认为它离表面 3 毫米;左侧摄像机认为是 2.7 毫米;斜角摄像机认为是 3.1 毫米。
我们会把这些观测按一定权重合并,而不是只相信其中一张。
这类似多人测量同一张桌子的长度:一个人量出 99.9 厘米;一个人量出 100.1 厘米;一个人量出 100.0 厘米。
综合后取一个更稳定的结果。
这就是多视角融合的价值
2026年08月23日 05点08分 4
level 13
惠更斯X 楼主
0.1.0~0.1.9建立基础多视角深度图、TSDF 和网格重建流程到尺度自适应:游戏中的物体是非常复杂的,为了避免直接陷入多重问题中,我们可以先自定义创建一些物体用于测试我们的逻辑是否可用,暂定为一个很薄的圆饼代替地毯,一个类似于戒指的大环,以及一个复杂一点的茶杯(这里GPT不知道为什么设计了一个德式啤酒杯,但测试够用了),用来先解决圆滑边界起刺的问题
2026年08月23日 05点08分 5
level 13
惠更斯X 楼主
目前的 SRL 不再只依靠一张从上往下的高度图。它会从多个方向拍摄“深度图”:上面;下面;前面;后面;左边;右边;八个斜角方向。0.1.0 的目标不是一次解决所有问题,而是先回答一个最基础的问题:
能不能在 MiSide 的 IL2CPP 环境中,从游戏内目标物体拍深度图,融合成体积,再生成一个新的 3D 网格?
2026年08月23日 05点08分 6
这一版证明了:深度替换着色器能在游戏中工作;多方向摄像机能正常获取数据;TSDF 能被分配和填充;能从体积中生成三角形模型;地毯、圆环和杯子都能完成一次重建。 这是非常重要的“从 0 到 1”。 0.1.0 只记录了:顶点数;三角形数;清理前后数量;扫描时间。 它还没有认真检查:模型有多少个碎片;有多少条开放边;是否水密;是否存在非流形;是否真的适合碰撞体。 因此它的成功更接近:“我们做出了一个看得见的模型。”而不是:“我们做出了一个物理上可靠的模型。” 另外,固定参数对不同尺度物体并不合理。 0.012 米体素对大杯子尚可,但对只有几厘米的小戒指会过于粗糙。 下一版0.1.1 的方向是:自动测量目标;自动判断它是大、扁、小还是复杂;自动选择分辨率和体素大小;不再依赖一套固定参数扫描所有物体。
2026年08月23日 05点08分
level 13
惠更斯X 楼主
0.1.1-0.1.2记录:世界尺寸;本地尺寸;扁平度;细长度;渲染器数量;碰撞体数量;已有碰撞体的可信程度;粗略复杂度。
然后自动规划:
精度大小
等质量等级;6 视图还是 14 视图;320 × 320 或 384 × 384;TSDF 截断距离;扫描边界留白;预计网格节点数量;
在得到了扫描的数据后,我们第一次看清真正的拓扑灾难:
”地毯“结果大致为:
25,108 个顶点;19,340 个三角形;30,502 条边界边;893 个连通部分;最大部分只占 22.1%;不水密。
这意味着:肉眼看到的“地毯”实际上是许多互相贴得很近的小碎片。
2026年08月23日 05点08分 7
问题的根本原因不是分辨率不够,而是早期表面提取方式的连接策略有问题。如相邻单元各自生成三角面时顶点位置可能略有偏差;相邻三角形没有共享同一个顶点;理论上连续的表面变成碎片;组件清理又进一步删除这些碎片。 下一步我们应该保证表面附近更连续;让每个体素有足够图像支撑;减少因采样过稀造成的断层;清理时尽量保留主要几何。
2026年08月23日 05点08分
level 13
惠更斯X 楼主
0.1.3:提高覆盖和连续性,但证明“平滑不能修复错误连接”
在这一版,我们为了TSDF表面连续性,对表面附近节点进行少量邻域混合:周围有足够已知邻居才处理;只混合一小部分;避免强行抹平细节。
同时,清理操作不能无限制删除几何。
系统开始关心:清理后至少保留多少三角形;最大部分占比;是否出现严重碎裂。
取得的成功:地毯的主要表面从数百个碎片,改善为一个主要整体。
这证明:采样覆盖;像素与体素比例;TSDF 连续性;确实能显著改善结果。
2026年08月23日 05点08分 8
仍然失败的地方:“地毯”虽然成为一个主要连通部分,但仍有大约 55,137 条边界边,占总边数约 37.5%,并不水密。 大圆环问题更加明显:初始提取约 42,900 个顶点;焊接后仍有 2,010 个部分;清理后还有 414 个部分;最大部分约占 47.3%;边界比例约 73.6%;被标记为碎裂;碰撞体被强制关闭。 修改方向:0.1.4 开始从网格连接关系入手: 合并非常接近的顶点;识别边界;尝试拓扑缝合;对碰撞体安全性进行分级。
2026年08月23日 05点08分
level 13
惠更斯X 楼主
0.1.4:开始“焊接和补洞”,但发现事后修理有极限
新增内容:亚体素顶点焊接“亚体素”表示容差小于一个体素。如果两个顶点的距离极小,就把它们合并。两轮焊接:初始网格后焊接一次;清理后再焊接一次。
这一版最大的成功,是系统不再把“生成了网格”误认为“生成了安全碰撞体”。
例如地毯:成为一个连通部分;最大部分为 100%;但仍有约37.5% 的边界;
焊接只能连接“已经非常接近”的顶点。
如果两个区域之间:缺了整排三角面;顶点距离超过安全容差;正负拓扑判断不同;一个区域本就被提取成错误形状;焊接无法解决。
把容差调大也不是办法,因为会造成:
戒指孔被焊死;杯口内外壁粘在一起;杯把粘住杯身;原本分开的表面被错误合并。
2026年08月23日 05点08分 9
修改方向:0.1.5 更换核心表面提取方式,使用共享边的 Surface Nets,从源头保证相邻单元共享连接。
2026年08月23日 05点08分
level 13
惠更斯X 楼主
0.1.5:Shared-edge Surface Nets 带来第一次结构性突破
本版核心变化
改用:Shared-edge Surface Nets相邻体素单元共享:表面交叉边;四边面连接;顶点关系。
这让生成阶段本身就更连贯。同时,顶点焊接容差反而可以变得更小,因为不再需要靠大容差强行修复结构。
“什么是 Shared-edge Surface Nets?(共享边的 Surface Nets)”
在把“数字果冻”(TSDF)变成游戏能识别的三角形模型时,我们需要决定每个小方块(体素)的表面长什么样。早期方法(图左):各自为政
就像两个装修工人分别贴墙纸,左边的人画了一条接缝,右边的人也画了一条接缝。虽然肉眼看过去差不多,但放大后会发现两条线根本没对齐,留下了微小的裂缝(micro-crack)。
这导致原本应该是一个整体的物体,被切成了成百上千个带裂缝的碎片,物理系统根本没法用。共享边方法(图右):严丝合缝
现在,相邻的小方块不再各算各的,而是共同使用同一条边和同一个顶点。就像拼图一样,相邻块完美拼接,严丝合缝!
测试结果“地毯”达到:14,348 个顶点;28,692 个三角形;0 条边界边;0 个非流形;1 个连通部分;最大部分 100%;水密;StaticClosedManifold;colliderSafe=True。
这是项目第一次得到明确的、完整的封闭碰撞体结果。
2026年08月23日 05点08分 10
修改方向 0.1.6 的重点不再是“更努力清理”,而是:如果模型已经是一个整体,就不要乱清理;如果操作后拓扑变差,就自动回滚;只修复足够小、足够明确的孔。
2026年08月23日 05点08分
level 13
惠更斯X 楼主
0.1.6:加入拓扑保护,避免“修理比原来更坏”
0.1.7:局部混合补全,开始针对最后的小裂缝
让所有后处理都遵守一个原则:不能只看三角形数量减少,还要看模型结构是否真的变好。
拓扑保护
后处理前后进行比较。
如果出现以下情况,就拒绝或回滚:边界比例明显增加;非流形增加;最大部分占比下降;连通部分数量恶化;保留的几何过少。
小型非流形修复:只处理非常局部、非常明确的异常扇面。
微小孔填补:只填较短、较规则的小边界环。
大圆环改善为:一个连通部分;最大部分 100%;约 30 条边界边;边界比例约 0.1%;0 个非流形;不完全水密;但可被评估为安全的静态开放表面。
与早期 414 个碎片、73.6% 边界相比,这是巨大进步。
2026年08月23日 05点08分 11
日志显示仍有少量:不完整四边面;退化四边面;无法安全恢复的局部单元。 即使局部补全,也不能强行决定。 因为错误补面可能造成:两层表面被接到一起;三张面共享同一条边;法线翻转;环孔被错误封闭。 因此系统宁可保留很小的开放边,也不制造更危险的非流形 修改方向:0.1.8 不再假设Surface Nets 永远是唯一最好选择,而是加入第二候选提取路径和自动比较。
2026年08月23日 06点08分
level 13
惠更斯X 楼主
0.1.8:计划中开始记录目标是否可能有薄结构,并为后续小物体优化做准备。“小戒指”测试结果仍然失败“小戒指”只有大约:0.061 米宽;0.009 米厚,虽然很小但比真正意义上的“戒指”还是要大得多。
旧计划中使用约:384 × 384;0.0012 米体素精度。
看起来已经很细,但对戒指环体来说仍然不够稳定。
早期“小戒指"结果出现:145 个连通部分;最大部分仅约 29.5%;
边界比例约44.5%;
Adaptive Dual 能选择更合适的“拼面工具”,但不能补回没有被足够清楚采样的结构。
2026年08月23日 06点08分 12
0.1.9 专门解决尺度问题: 更高分辨率;更小体素;所有几何容差按体素大小缩放;薄结构至少占一定数量体素;小物体使用独立扫描计划。
2026年08月23日 06点08分
level 13
惠更斯X 楼主
0.1.9:尺度自适应让小戒指首次完整成功
核心变化:小物体识别系统识别到戒指属于小物体。
分辨率,提升使用:512 × 512而不是 384 × 384。
体素缩小戒指使用约:0.00089 米也就是约 0.89 毫米的体素精度。
0.1.9 的戒指达到:
8,512 个顶点;17,024 个三角形;25,536 条正常边;0 条边界边;0 个非流形;0 个退化三角形;0 个针状三角形;1 个连通部分;最大部分 100%;水密;StaticClosedManifold;colliderSafe=True。
这说明:戒指不仅肉眼看起来完整,在拓扑数据上也形成了一个真正封闭、连续、可作为静态碰撞体的模型。
2026年08月23日 06点08分 13
level 13
惠更斯X 楼主
0.1.9 解决了“小物体和薄结构怎样按自身尺度重建”的问题,但杯子留下了一个更深层的难题:> 有些表面不是算得不够细,而是固定摄像机根本没有从正确方向看见。
0.2.x 没有立刻让摄像机到处乱拍,而是把问题分成一连串可以单独验证的小问题。| 版本 | 最主要的问题 | 本版使用的思路 | 本版留下的新问题
0.2.0 | 14mm 空隙会被 TSDF 错误粘住 | 更细的单一 Dense TSDF、窄截断带、自由空间保护 | 杯子仍有第二个独立表面,但不知道它在哪里
0.2.1 | 只知道“有两个组件”,不知道分别是什么 | 给 TSDF 组件、Mesh 组件和开放边界定位、编号、对应 | 找到杯内底,但还不知道该从哪里补拍
0.2.2 | 想用一个顶部透视视角直接看进杯子 | 14 个正交视角加一个 `InteriorProbe` | 杯底可能连上了,却产生 166 个 TSDF 小组件和 46 个 Mesh 组件
0.2.3 | 一次失败探针会制造大量碎片,不能逐个处理 | 未知空间地图、候选评分、碎片聚类、数量上限 | “相机可达”被误当成“新信息很多”
0.2.4 | 评分选中了不够有价值的普通边界 | 把可达性与未知前沿分开,选出唯一 Primary | 区域选对了,但相机姿态仍重复 Top,FOV 过宽
0.2.5 | 知道要看杯底,却不知道怎样安全地看 | 新颖方向、距离、覆盖和 FOV 联合规划 | 数学上可见,不代表真实渲染时没有遮挡
0.2.6 | 需要证明真实深度相机确实看见杯底 | 一次性真实预拍,只分析、不融合 | 预拍通过后,仍需证明融合会改善而不是制造碎片
0.2.7 | 新探针怎样安全加入完整重建 | 从空 TSDF 重建 14+1,A/B 比较,失败自动回滚 | 当前等待首次游戏内融合测试 |这八个版本可以浓缩成一句话:> 先保护真实空隙,再找到没有连接的表面;先决定看哪里,再决定怎样看;先真实预拍,最后才允许融合。
2026年08月23日 06点08分 14
level 13
惠更斯X 楼主
0.2.*的实验都是在尝试解决同一个目标,即杯状物体长期测量结果分为两个主要部分组件;一个是正上方相机拍摄到的圆形杯底,另外一个是14相机整体拍摄到的外壁,其中断开的部分是杯子内壁只有上半部分能被斜上方四个相机拍摄到;如果不能解决这样的简单问题,对于更复杂的真实物体显然会更加无力
2026年08月23日 06点08分 15
1 2 3 尾页