体素(Voxel)
脚本入口: eve.Voxel()
高性能 3D 体素世界:32³ chunk、贪婪矩形合并(面合并成矩形减少实例数)、32-bit 打包实例、 六向子缓冲、视锥/视距/朝向裁剪后实例化绘制。支持跨 chunk 接缝消隐、并行重建、 顶点环境光遮蔽(AO)、DDA 射线拾取、存档/流式卸载与**自动流式地形生成**, 适合建造/破坏玩法与可移动大世界。
基本用法
流式大世界(每帧保持玩家周围 chunk)
streamAround 返回本次**插入世界、可立即绘制**的 chunk 数(卸载数可用 getChunkCount 差值计算)。 第 5 个参数 maxCreates 为 0(默认)时在调用线程一次补齐半径内全部缺失 chunk。大于 0 且使用内置噪声地形(无脚本 generator、未加载 EVTR)时,主线程只入队最近 N 个任务:工作线程填充体素并网格化,后续某帧 streamAround 再把已完成的 chunk 插入世界并绘制。脚本 generator 与 EVTR 资产路径仍在调用线程执行。 getInflightStreamCount() 是尚未插入世界的后台任务数。setStreamCacheChunks(extra) 在加载球外再留一圈:离开时不立刻卸载,飞回来可直接绘制;超出 radius + extra 才回收。默认 extra=0(与旧行为一致)。地形是确定性的:同一世界坐标 + 同一 seed 永远得到相同高度,跨 chunk 无缝衔接。
使用烘焙 EVTR 地形
需要侵蚀、河网和生态群落时,先由 Procgen 烘焙 EVTR,再交给体素世界。 streamAround 会自动预取覆盖体素半径的地形资产块,资产高度优先于噪声回退:
也可用 streamTerrainAssetAround(worldX, worldZ, radius, maxLoads) 手动设置每帧解码 预算;返回本帧加载的资产块数。getTerrainAssetResidentCount() 返回当前解码缓存数。
射线拾取(放置/破坏/瞄准)
API 快查
Voxel(模块)
newCubeTypes():新建空方块类型注册表。newWorld()/newWorldWithTypes(types):新建世界(可带注册表)。getChunkSize():32(常量)。
VoxelCubeTypes(注册表)
loadFromJson(json):批量注册,元素{"name","faceTex":[6],"directional","composeGroup","connects"}。count()/variantCount()/clear()。
VoxelWorld(世界)
- 编辑:
getVoxel(x,y,z)、setVoxel(x,y,z,texId)(0=空气,不创建空 chunk)、setVoxelByName(x,y,z,name,orientation)、getCubeTypeName/getCubeTypeTex、getRevision()(内容真实变化时单调增长,供编辑器、存档和预览失效检测)。 - 网格:
remeshDirty()(自动并行)、getChunkCount()、hasChunk、removeChunk、clear。 - 存档/流式:
saveWorld()(返回data.newByteData可直接落盘)、loadWorld(byteData)、unloadChunksOutside(cx,cy,cz,radiusChunks)(卸载半径外的 chunk,返回卸载数)、setStreamCacheChunks(extra)/getStreamCacheChunks()(streamAround卸载半径 = 加载半径 + extra)、streamAround(cx,cy,cz,radiusChunks [,maxCreates])(自动补建+生成+卸载+重建,返回本帧插入世界的数量;内置噪声 + maxCreates>0 时后台填充,就绪帧插入)、getDirtyCount()、getInflightStreamCount()、setTerrain(seed, top, sub, stone, base, amp, scale)(快速配置)、setTerrainParam(key, value)(细粒度配置,见下方参数表)、loadTerrainAsset(bytes, offset, scale)、streamTerrainAssetAround(worldX,worldZ,radius,maxLoads)、setTerrainAssetMaterials(vegetation,sand,snow,alpine,riverbed)/disableTerrain()。 - 渲染:
selectVisible(viewProj16, eyeX,eyeY,eyeZ, viewRange, faceCull)、drawVisible(gfx, atlasTex, tilesPerRow)、getVisibleBatchCount/getVisibleChunkCount/getVisibleRectCount。 - 拾取:
raycast(ox,oy,oz,dx,dy,dz,maxDist)+lastRaycastHit()、getRaycastHitX/Y/Z、getRaycastPrevX/Y/Z(命中前一个空气方块)、getRaycastFaceX/Y/Z(进入面法线)。
生命周期
- Vulkan 与原生 WebGPU(Dawn)均有实例化面绘制路径。浏览器
EVENGINE_PROFILE=web仍不编本模块:VoxelWorld公共头嵌入procgen::TerrainStreamingCache,且procgen会拖map→Poco。要进web需先把地形流式 API 拆成可选卫星,不是 WebGPU 画不出体素。 - 世界与注册表由脚本 VM 持有,不要直接构造
VoxelWorld/VoxelCubeTypes。 - 边界编辑会同时把相邻 chunk 标记 dirty;
remeshDirty()后接缝两侧一起重建, 不会残留被遮挡的旧面。 - 视距外的脏 chunk 不会在
selectVisible时重建,进入视距后自动补网格。 - 顶点 AO 在 remesh 时自动烘焙到矩形四角(0..3),无需额外配置;平坦表面全亮, 台阶/凹角自然变暗。
setTerrainParam参数表:seed/top/sub/stone/sand(纹理 id)、base/amplitude(世界高度映射)、scale或frequency(噪声频率, 默认 1/32)、octaves/lacunarity/gain(fBm)、ridge/warp/exponent(山脊/域扭曲/指数)、continent/island/coast(大陆-海岸形状)、worldWidth/worldHeight(岛屿衰减框,>0 才生效)、sandLevel(归一化采样高度阈值,>0 且sand非 0 时启用沙滩带)、enable(1 打开地形)。setTerrainParam只覆盖传入的键,其余参数保持默认;地形默认关闭,需enable=1。- 存档格式为可移植小端二进制(
EVVX+ 版本 + chunk 坐标与体素),加载后网格按需重建。