Unity中TreeInstance转世界坐标问题:获取地形树木位置不准确
Unity地形树木世界坐标获取修正
你当前代码获取的treeInstance.position是相对于地形的归一化坐标(取值范围0~1),并非直接的世界坐标,所以需要转换后才能得到正确位置。
正确的转换代码如下:
// 获取当前激活的地形组件及数据 Terrain terrain = Terrain.activeTerrain; TerrainData terrainData = terrain.terrainData; foreach (var treeInstance in terrainData.treeInstances) { // 计算树木在地形本地空间的坐标 Vector3 localPos = new Vector3( // x轴:归一化比例 × 地形实际宽度 treeInstance.position.x * terrainData.size.x, // y轴:对应地形高度 + 树木自身高度偏移比例 × 地形高度范围 terrainData.GetHeight( (int)(treeInstance.position.x * terrainData.heightmapWidth), (int)(treeInstance.position.z * terrainData.heightmapHeight) ) + treeInstance.position.y * terrainData.size.y, // z轴:归一化比例 × 地形实际长度 treeInstance.position.z * terrainData.size.z ); // 转换为世界坐标(加上地形自身的世界位置偏移) Vector3 worldPos = localPos + terrain.transform.position; resourcePositions.Add(worldPos); }
关键说明:
treeInstance.position.x/z:对应地形宽度/长度的占比,乘以terrainData.size.x/z得到地形本地空间的x/z坐标treeInstance.position.y:是树木相对于地形表面的高度偏移比例,需要结合GetHeight获取的地形基础高度,再加上偏移值- 最后必须加上地形对象的
transform.position,因为地形可能没有放置在世界原点
内容的提问来源于stack exchange,提问作者ARR
相关产品推荐
相关产品推荐

