Project dossier

completed20264 entries

NAIWA / 奶蛙

一个以奶蛙为视觉主体的 3D 网页实验,围绕模型、粒子、滚动叙事、声音和指针交互组织完整体验。

ViteThree.jsOGLGSAPGLSLthree-mesh-bvh

项目简介

NAIWA 是一次以奶蛙为视觉主体的 3D 网页练习。它从一个很直接的动机开始:我喜欢这个角色,突然想拿它锻炼一下网页图形和交互技术,于是把一次模型练习继续做成了完整的滚动体验。

奶蛙角色并非由我创建。网页中的 3D 模型由我自行制作,参考的是网络公开图片。这里记录的是建模、渲染和交互实现,不主张角色原创,也不收录参考图链接。

体验结构

页面把内容拆成四个连续阶段:

  • ORIGIN:先展示完整模型,让用户建立形体和材质认知。
  • SOFT:模型开始从实体转向粒子,表面细节逐步松开。
  • STILL:粒子场进入相对稳定的状态,指针可以在模型和粒子之间形成局部反馈。
  • RELEASE:粒子短暂收束后释放到更大的空间,滚动反向时能够回到前一状态。

滚动不是章节之间的跳转,而是把模型形态、背景场、标题、说明文字和声音触发放进同一条进度轴,让每个变化都有前后关系。

技术实现

模型以 FBX 资源载入,使用 MeshSurfaceSampler 从模型表面取得粒子初始位置。粒子数据写入 BufferGeometry,颜色和位移交给自定义 shader 在 GPU 侧处理,避免在每一帧用 JavaScript 逐粒子修改对象。

指针交互分成两层:模型阶段通过 raycast 判断指针是否真正命中实体;粒子阶段把命中点转换成局部影响范围,再将排斥、拖尾和回归效果传给 shader。模型 raycast 使用 three-mesh-bvh 加速,减少复杂网格下的命中成本。

性能策略以设备条件为输入。粒子数量不是固定常数,而是根据视口、设备类型和像素比选择预算:移动端约 12,000 个粒子,桌面端约 22,000 个粒子,同时限制高密度屏幕的渲染像素比。这样保留形态识别和交互反馈,也避免把计算量全部交给低性能设备。

声音只作为体验节点出现,不作为持续背景层。页面在用户主动交互后触发本地音频,并随滚动阶段和界面反馈保持克制,避免声音遮盖视觉叙事。

项目边界

这是一个个人技术练习和交互实验,不是奶蛙角色的原创设定,也不把网页中的模型、参考图片、音频或源代码作为公开资料分发。站点中的博客和技术库只讨论过程、原理和取舍。

关联内容: