You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Raylib中实现Heightmap(高度图)的3D碰撞检测?

在Raylib中根据玩家位置获取高度图对应像素的方法

要实现你需要的碰撞检测,核心是把玩家的世界坐标转换为高度图纹理的像素坐标,再读取灰度值计算地面高度。以下是具体步骤:

1. 保留高度图的图像/纹理引用

首先,确保你在加载高度图时保留了Image或Texture2D对象,同时记录生成网格时的缩放参数(这是坐标转换的关键):

// 加载高度图图像(优先用Image,读取像素更直接)
Image heightmapImg = LoadImage("your_heightmap.png");
// 定义高度图模型的世界缩放(X/Z是平面尺寸,Y是最大高度)
Vector3 mapScale = { 100.0f, 20.0f, 100.0f };
// 生成高度图网格和模型
Mesh mesh = GenMeshHeightmap(heightmapImg, mapScale);
Model heightmapModel = LoadModelFromMesh(mesh);
// 加载纹理用于渲染(可选,若需要贴图)
Texture2D heightmapTex = LoadTextureFromImage(heightmapImg);
heightmapModel.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = heightmapTex;

2. 将玩家XZ坐标转换为像素坐标

玩家的Vector3 playerPos是世界空间坐标,需要把X和Z映射到高度图的像素索引:

// 1. 把玩家X/Z转换为[0,1]范围的UV值(假设模型在世界空间居中,X范围[-50,50],Z同理)
float u = (playerPos.x + mapScale.x / 2) / mapScale.x;
float v = (playerPos.z + mapScale.z / 2) / mapScale.z;

// 2. 转换为像素坐标,注意纹理Y轴是向下的,所以反转v
int pixelX = (int)(u * heightmapImg.width);
int pixelY = (int)((1.0f - v) * heightmapImg.height);

// 3. 防止像素越界(必须做,否则会读取无效内存)
pixelX = Clamp(pixelX, 0, heightmapImg.width - 1);
pixelY = Clamp(pixelY, 0, heightmapImg.height - 1);

3. 读取像素灰度值并计算地面高度

从图像中获取像素颜色,转换为灰度值后计算对应的世界空间地面高度:

// 获取像素颜色(高度图是灰度图,RGB值相同)
Color pixelColor = GetImagePixel(heightmapImg, pixelX, pixelY);
// 计算0-1范围的灰度值
float grayNormalized = (pixelColor.r / 255.0f); // 直接取R通道即可,灰度图RGB一致
// 转换为世界空间高度:灰度0对应最低高度,255对应最高高度(mapScale.y)
float groundHeight = grayNormalized * mapScale.y;
// 如果你的模型是居中放置的(Y范围[-10,10]而非[0,20]),则用下面的计算:
// float groundHeight = (grayNormalized * mapScale.y) - (mapScale.y / 2.0f);

4. 碰撞判定

对比玩家Y高度和地面高度,加入小偏移量避免精度问题:

// 碰撞偏移量,防止因浮点精度导致的误判
const float collisionTolerance = 0.3f;
if (playerPos.y < groundHeight - collisionTolerance) {
    // 触发坠毁逻辑
    // TODO: 处理玩家坠毁
}

注意事项

  • 不要用压缩纹理加载高度图,否则无法读取像素数据;如果必须用压缩纹理,需先加载Image再生成纹理。
  • 调整v的反转逻辑:如果你的地图Z轴方向和纹理Y轴方向一致,可去掉1.0f - v的反转,具体可通过测试玩家在地图角落的对应像素是否正确来验证。

内容的提问来源于stack exchange,提问作者Reverend Speed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:33:19