Chapter 220 · 3D 图形

地形高度场

把高度网格交给引擎:固定分块、1-4 级 LOD、垂直裙边——采样按真实三角形插值,射线连裙边一起测。

220

从高度数组到地形

xge3d_terrain_desc_t td = xge3dTerrainDefault();
td.heights     = pHeights;             // uint16 或 float 数组(原样拷贝,无 8bit 转换)
td.width = td.depth = 257;
td.format      = XGE3D_HEIGHT_F32;
td.cell_size   = 1.5f;
td.height_scale = 1.0f;  td.height_offset = 0.0f;
td.chunk_cells = 32;                   // 每块边长(格)
td.lod_count   = 4;                    // 1..4
td.lod_distances[0] = 90;  td.lod_distances[1] = 180;  td.lod_distances[2] = 300;
td.material    = pGroundMaterial;

xge3d_terrain *pTerrain;
xge3dTerrainCreate(&td, &pTerrain);

xge3d_node_t tRoot;
xge3dTerrainInstantiate(pScene, pTerrain, (xge3d_node_t){0}, &tRoot);
xge3dTerrainFree(pTerrain);   // 实例持有网格与材质后即可释放

查询:采样与射线

float fHeight; xge3d_vec3_t tNormal;
xge3dTerrainSample(pTerrain, 0, fLocalX, fLocalZ, &fHeight, &tNormal);

xge3d_hit_t tHit; size_t stChunk;
xge3dTerrainRaycast(pTerrain, 0, &tRay, 500.0f, &tHit, &stChunk);
三角形级精度:Sample 对实际三角形插值(不是双线性近似);Raycast 含裙边。两者都指定网格层级(0 为精细面),而渲染中的块可用不同层级——查询与显示解耦。

xge3dTerrainInfo 返回块数、LOD 数与表面包围盒(不含裙边);xge3dTerrainChunkMesh 借出指定块的网格与块内位置,供自定义碰撞或导航使用。引擎不提供世界流式加载与游戏规则——地形数据是一次性常驻的。