Skip to content

体块生长与施工过程动画 ​

初始化中…

同一个建筑体块模型,前一页是静态查看,这一页让它按天"长"出来。做这个实验的动机很简单:我想验证在不做任何额外资产的前提下,只靠几何变换能不能表达出"过程",而不是只表达"结果"。

想验证的三件事 ​

  1. 时间轴驱动几何能不能做到不抖、不穿模。体块从地面长出来,缩放基准点不对的话,整栋楼会往下沉或者往上飘。
  2. 错峰开工是不是比“全场一起长高”更像施工现场。这份模型有三十五栋建筑主体,全部同一天封顶就很假。
  3. 不加控件能不能把动画讲清楚。这是我这个站的一条硬约束:全站纯静态、零交互,所以没有进度条、没有播放暂停按钮,只能自动循环,把状态写在文字读数里。

关键做法 ​

先弄清模型是怎么组织的。 这份 glb 是脚本导出的,528 个节点平铺在场景根下,命名是 B01、B01_roof、B01_win、B01_door0 这种“前缀 + 构件”的形式;除了 B01–B35 这三十五栋,剩下的全是 mark* 场地标记和 road* 道路。也就是说模型本身没有“一栋楼一个父节点”的层级,想按栋施工只能靠名字分组。这一步不摸清,后面全白做。

下沿对齐要配一次位移补偿。 缩放是围绕节点原点做的,而导出的几何顶点里带着真实高度——屋顶的顶点本来就在十几米高处。所以先把几何沿 y 平移 -bb.min.y 把底面压到局部原点,再把节点 position.y 加上同样的量抬回原位:

js
o.geometry = o.geometry.clone()          // 先克隆,别动可能被复用的几何
o.geometry.computeBoundingBox()
const shift = o.geometry.boundingBox.min.y
o.geometry.translate(0, -shift, 0)       // 底面压到局部原点
o.position.y += shift                    // 补偿回去,世界位置保持不变

只做第一步的话,所有悬在空中的构件(屋顶、窗、雨棚)会一起掉到地面上,因为它们的高度信息本来就在顶点里,被减掉了。克隆那一行是防手滑:万一导出工具复用了同一个几何实例,两次平移就把后一处平移掉了。

同一栋先主体、后构件。 分组之后给每栋一个开工时刻,主体按编号顺序错峰推进,窗、门、雨棚这些附属构件等主体封顶之后再出现,视觉上就是"结构完成 → 装外立面":

js
const s = (gi / n) * 0.7                 // 这栋的开工时刻
it.s = it.isPart ? s + 0.16 : s          // 附属构件晚一点开始
it.e = it.isPart ? s + 0.21 : s + 0.16   // 安装比结构快
const k = clamp((t - it.s) / (it.e - it.s), 0, 1)
o.scale.y = Math.max(0.001, k * k * (3 - 2 * k))   // smoothstep

道路和场地标记(road*、mark*)的前缀不是 B,我把它们排除在生长之外,一开始就摆在那儿——先有场地再有楼,这个顺序本来也不该反。

scale.y 不能真的取 0,取 0 之后法线和阴影会出问题,所以留一个极小值。用 smoothstep 而不是线性插值,是为了让每栋楼起停时不突兀,线性缩放在两端会有明显的"弹一下"。

“封顶”按栋统计,不按网格统计。 第一版我直接数完成生长的 mesh 数量,HUD 上写着“已封顶 173 栋”,看着很唬人,其实那是一百多个构件——一栋楼有主体、屋顶、窗、若干门和雨棚。改成“一栋里所有构件都到位才算封顶”之后,数字才对得上。这种读数一旦错,整页的可信度就没了。

留 15% 时间展示完成态。 一轮 24 秒里,前 85% 走完施工,后 15% 停在全封顶状态。不在成品上停一下,看的人就不知道"最后应该长这样"。

读数代替控件。 文字区每跨一天更新一次,显示当前是第几天、已封顶多少栋。只在天数变化的时候重写文字,不是每帧都改,否则浏览器一直在做无意义的 DOM 更新。

和静态查看版差别在哪 ​

静态版关心"这个场景对不对":轮廓、高度、排布、有没有重叠。生长版关心"这个场景能不能被时间驱动"。同一份模型、同一套光照、同一套控制器,只多了一个 grow 开关和几十行动画逻辑,模型体积一点没涨(还是那个 1 MB 的 glb)。

已知不足 ​

  • 没有塔吊、围挡、渣土车。 这些要额外建模,属于资产问题不是技术问题。现在这版严格说叫"体块逐日封顶",不叫施工模拟。
  • 推进顺序是构件编号顺序,不是施工计划。 真按工序走需要给每栋楼挂一个计划区间,那就变成数据问题了。
  • 地下结构不可见。 现在从地面开始长,基坑和桩基阶段表现不出来。要做就得允许负高度,缩放基准点得重新想。
  • 循环起点会跳。 一轮结束直接回到第一天,全场瞬间消失。想平滑就得加"拆除"或者淡出,我觉得没必要,循环动画的边界本来就是硬边界。

下一步 ​

要把这个动画接到真实进度上,我的想法是:给每栋楼一个计划区间,把 s 和 e 从"按编号算出来"换成"从数据读进来",剩下的渲染逻辑一行不用改。这也是我一开始把时间轴和几何分开写的原因。

本站为个人技术展示网站,仅用于个人研发作品、3D 数字孪生技术学习展示,无任何经营性服务、无社区互动、不对外提供商业服务。

本站为个人技术展示网站,仅用于个人研发作品、3D 数字孪生技术学习展示,无任何经营性服务、无社区互动、不对外提供商业服务。

蜀ICP备2026068005号-1|个人 3D 数字孪生技术研发展示站