«

「开放世界区」浏览器三维世界项目,一个临时小 demo,多建筑 LOD 机制

时间:2025-12-29 19:40     作者:独元殇     分类: WebGL


我的这个三维小项目,其实一直有在更新,我上个月为其命名为 Open World Zone,也就是「开放世界区」。

目前有三个方向的优化:内容的填充、多模型管理、性能的优化。

这次是一个 多模型的管理的 demo ,我单独抽离出来了,因为其他两部分还没完善:

(最新的 demo ,能根据主角的位置,来切换不同的模型。)

https://ow.ccgxk.com/demo/dev001/

img

我内心想把它给搞成一个无限大的三维世界。

想象这个场景:

  1. 浏览器一进入,根本没有加载时间,马上就打开了。极速!
  2. 低配置电脑,也用的很得劲,非常流畅。
  3. 能多人在线
  4. 自由度还可以
  5. 世界让人非常有探索欲

甚至里面能放置自己的笔记和图片等等,建造自己的模型,然后上传到这个共享世界。一个极度轻量级、高性能的共享世界。

多么好啊。

其实,模型的搭建简单的不得了了。但是我一共里面只有 100 万个模型档案的储存容量、电脑 5 万模型的流畅阈值,怎么能让它按需加载,按需删除,又不超过这个阈值,还真没想象中容易。

就像电脑机械硬盘,就是一个大光盘,一条线。怎么能存 3G ,删除 5G,又进去 200MB 又删除 1.5G ,能进行的秩序井然。

我足足换了好几个方案。

最终留下了这个万数块方案(详情请阅读代码)。

过程不详细讲了。但,这个看起来很简单的机制,真的难住了 Gemini 和 我。整整搞了一个多月,12 月中旬,才算像回事。

这个 demo 很简单。里面有 4000 个图书馆建筑。(现在我可以自信的说,理论上能完美管理无穷无尽的模型了)

  1. 当你进入建筑内部,内部桌椅才加载(到时候,会有影壁墙等遮住,感觉好像一直都有)
  2. 离开建筑一段距离,会变成粉红色(到时候,就是一个更少模型的简易外墙)
  3. 再离开建筑更远距离,整个建筑,抽象为一个独立的方块(我称其为天际线)

目前就是这个样子。

别失望,我觉得,这个痛点早日优化比较好。

现在我给我的 openworld.js 设计了个 logo :

img

其 SVG 全文为:

<svg style="width:500px" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
  <!-- 2. 身体与头部 (小白狗) -->
  <circle cx="100" cy="85" r="50" fill="white" stroke="#222" stroke-width="4"/>

  <!-- 3. 耳朵 (耷拉着,看起来憨厚) -->
  <ellipse cx="45" cy="85" rx="15" ry="25" transform="rotate(20 50 85)" fill="white" stroke="#222" stroke-width="4"/>
  <ellipse cx="155" cy="85" rx="15" ry="25" transform="rotate(-20 150 85)" fill="white" stroke="#222" stroke-width="4"/>

  <!-- 4. 表情 (呆萌) -->
  <circle cx="85" cy="80" r="5" fill="#222"/> <!-- 左眼 -->
  <circle cx="115" cy="80" r="5" fill="#222"/> <!-- 右眼 -->
  <ellipse cx="100" cy="90" rx="6" ry="4" fill="#222"/> <!-- 鼻子 -->
  <path d="M90 100 Q100 110 110 100" fill="none" stroke="#222" stroke-width="3" stroke-linecap="round"/> <!-- 嘴巴 -->
  <circle cx="75" cy="95" r="6" fill="#FFB6C1" opacity="0.6"/> <!-- 腮红 -->
  <circle cx="125" cy="95" r="6" fill="#FFB6C1" opacity="0.6"/>

  <!-- 5. 皇冠 (King) -->
  <path d="M75 50 L75 35 L87 45 L100 30 L113 45 L125 35 L125 50 Z" fill="#FFD700" stroke="#222" stroke-width="3" transform="translate(0, -5)"/>

  <!-- 文字 -->
  <text x="100" y="170" font-family="Arial, sans-serif" font-weight="bold" font-size="14" text-anchor="middle" fill="#222">OPENWORLD.JS</text>
</svg>

png 是 :

img

标签: 原创 三维 开放世界区