关于 world
面向 3D 游戏开发者的场景构建技能,提供地形、距离线索、环境密度、比例和渲染润色建议,帮助构建连贯的大型空间并兼顾帧率。
主要功能
- 01按玩家移动方式规划世界尺寸
- 02用连贯噪声塑造地形
- 03设置地平线、雾效与远景
- 04用 InstancedMesh 散布重复物体
- 05保持比例并完善画面效果
适用场景
- 01构建大型户外游戏地图
- 02用纵深线索隐藏绘制距离边缘
- 03高效布置重复场景物件
- 04让地形碰撞与地形形状一致
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ drawcall-ai/ skills --skill world安装后在 Claude Code 中输入/world确认已加载。
详细介绍
世界规模与距离
世界显得很小,原因通常有三个,而且都可以解决:物理尺寸太小、在可见的边缘处结束,或者远处什么都没有。“大地图”意味着宽达数百米,而且每个视野尽头都有东西,而不是一块 150m 的区域,外面全是空地。
根据体验决定尺寸
根据玩家的移动方式选择世界尺寸。玩家可以冲刺一分钟穿过的第三人称射击游戏地图,宽度大约应为 300–1000m,而不是约 150m。兴趣点之间要留出足够的距离,让玩家需要花上实实在在的几秒钟才能抵达。
塑造地面
户外地面几乎从来都不是平的——除了未贴图的灰色地面,平坦的平面是最明显的“未完成原型”迹象。让地形拥有真实的起伏:细分平面的顶点,用分层噪声位移,生成丘陵、斜坡和山谷;也可以用高度图驱动地形。噪声必须是连续的——对每个顶点调用 Math.random() 会产生尖刺状的杂波,而不是丘陵。Three.js 没有自带噪声函数,因此请添加 simplex-noise 包,并叠加几个倍频层(每层振幅减半、频率加倍),让大丘陵带有细小起伏。塑造出清晰易辨的地标——一道山脊、一个盆地、几处高地——让空间具有战术多样性,然后调用 geometry.computeVertexNormals(),使光照贴合地形形状。确保碰撞体和导航网格都与塑形后的地形对齐,而不是与下方另铺的一块平地对齐。
地形和其他表面一样,需要使用真实材质,而不是纯色(参见 materials 技能)。应用平铺的地面纹理;对于大型地图,还要根据坡度和高度混合纹理(平地使用草地、陡坡使用岩石或悬崖、岸边使用沙地),避免整张地图看起来像一块平坦的绿色毯子。
为世界营造纵深
眼睛通过深度线索判断规模——提供以下全部三种线索,让世界拥有地平线,而不是边缘:
- **地平线:**天空盒/环境背景,或远处的地形轮廓,让地面看不到生硬的尽头。
- **雾:**设置
scene.fog = new Fog(skyColor, near, far),并调整参数,让远处几何体逐渐融入天空。雾既能增加纵深,也能隐藏绘制距离的边缘。雾的颜色应与天空颜色一致。 - **远景细节:**大型背景地貌、山脊线或建筑物,让玩家看得见,但未必能抵达。
将相机的 far 平面设在雾的最远距离之外,避免物体突然出现;同时将 near 保持在合理范围内(例如 0.1),以确保深度精度。
丰富场景,但别拖垮帧率
密度能让世界显得真实;几件道具之间空荡荡的地面看起来像原型。沿地形散布密集细节——草丛、岩石、灌木、碎屑——并将道具聚集在特定地点(如前哨站、树林),而不是均匀撒开。直接复制大量对象会拖垮帧率,因此重复细节应使用 InstancedMesh。
加载的道具很少只是单个网格:glTF 会将一个模型表示为层级结构,而包含多种材质的部件(例如树干和树叶、石块和苔藓)会以一组单独的网格形式加载,每个图元对应一个网格。InstancedMesh 为一组几何体和材质创建实例,因此,如果找到第一个网格就直接实例化,其他图元都会被悄悄丢弃——你散布的会是光秃秃的树干,而不是树。应为每个图元分别创建 InstancedMesh,并让它们共享相同的实例变换;或者先将模型的所有图元合并为一个几何体。注意,THREE.LOD 会根据距离替换整个对象,不会针对每个实例单独工作。因此,对于远处的实例化细节,应自行按距离剔除(跳过远处的实例,或分别维护近处/远处实例池),不要把实例包装进 LOD。
保持比例一致
以米为单位创作所有内容,并以角色身高(约 1.8m)为基准。一棵树和玩家一样高,或一个箱子和房子一样大,都会比其他任何因素更快地破坏场景的真实感。
完善图像效果
正确几何体的原始渲染看起来仍然很平淡。轻度后期处理——微妙的泛光、用于增强物体落地感的环境光遮蔽,以及柔和的色彩分级(参见 postprocessing 技能)——往往正是“精致的游戏”和“技术演示”之间的区别。等场景效果看起来正确后再添加,不要提前添加。