【问题标题】:Why does assigning heightmapResolution increase the size of my terrain?为什么分配 heightmapResolution 会增加地形的大小?
【发布时间】:2015-04-17 19:06:54
【问题描述】:

所以我一直在尝试使用代码生成地形,但遇到了一个问题。当我分配 heightmapResolution 时,我的地形大小会增加两倍的幂。

例如,如果我的 heightmapResolution 为 513,那么我的地形大小将增加 16 倍。如果我的 heightmapResolution 为 257,那么我的地形大小将增加 8 倍。

据我了解(我也已阅读此内容),heightmapResolution 不应影响地形的大小。

我必须强调,尺寸增加只发生在 X 和 Z 轴。高度保持不变。

        /// <summary>
        /// Gets the terrain data either from memory if its loaded, from disk if it isnt, or generates a new one of neither of those are available.
        /// </summary>
        /// <value>The terrain data.</value>
        public static TerrainData terrainData {
            get {
                TerrainData terrainData = new TerrainData();
                if(isTerrainLoaded){
                    //Debug.Log("terrainData is already loaded, returning it!");
                    return(loadedTerrainData);
                }
                else if(Resources.Load("terrainData") != null && !generateNewTerrain){
                    terrainData = Resources.Load("terrainData") as TerrainData;
                    Debug.Log("Read terrainData from disk!");
                }
                else{
                    Debug.Log("No terrainData found on disk, generating a new random one...");

                    terrainData.size = new Vector3(width, height - sandBaseHeight, length);
                    Debug.Log ("Original terrain size: " + terrainData.size);
                    terrainData.heightmapResolution = heightmapResolution;
                    Debug.Log ("Bigger terrain size: " + terrainData.size);
                    terrainData.baseMapResolution = baseMapResolution;

                    terrainData.SetDetailResolution((int)detailResolution.x, (int)detailResolution.y); //(int) because data is stored in a Vector2 which is float
                    terrainData.alphamapResolution = aplhaMapResolution;

                    float[,] heights = new float[terrainData.heightmapWidth,terrainData.heightmapHeight];
                    Vector2 randomLocation; //for perlin noise
                    randomLocation.x = Random.Range(-10000,10000);  //that is hopefully enough
                    randomLocation.y = Random.Range(-10000,10000);

                    for (int x = 0; x < terrainData.heightmapWidth; x++) {
                        for (int z = 0; z < terrainData.heightmapWidth; z++) {
                            heights[x,z] = Mathf.PerlinNoise(randomLocation.x + (float)x/scale, randomLocation.y + (float)z/scale);
                        }
                    }
                    terrainData.SetHeights (0, 0, heights);
                    terrainData.splatPrototypes = splatTextures;

                    AssetDatabase.CreateAsset(terrainData,"Assets/Resources/terrainData.asset");
                }
                loadedTerrainData = terrainData;
                return(terrainData);
            }
        }

这就是生成我的地形数据的集团。地形大小的变化已经在 Debug.Log 中可见(“更大的地形大小:” + terrainData.size);在我分配 heightmapResolution 之后立即。

关于为什么会发生这种情况的任何想法?

【问题讨论】:

  • 你用过调试器吗?
  • 我想通了,并在下面发布了我的答案。我确实使用了调试器,只是尝试了不同的东西,直到它以某种方式起作用。
  • 我猜这是因为 Unity 在设置 heightmapResolution 以保持输出的实际分辨率时尝试重新缩放地形? (只是一个想法)

标签: c# unity3d terrain heightmap


【解决方案1】:

我想通了。

在设置地形大小之前,我必须设置高度图分辨率。 这是按预期工作的最终代码。

terrainData.heightmapResolution = heightmapResolution;
terrainData.size = new Vector3(width, height - sandBaseHeight, length);
terrainData.baseMapResolution = baseMapResolution;
terrainData.SetDetailResolution((int)detailResolution.x, (int)detailResolution.y);
terrainData.alphamapResolution = aplhaMapResolution;

Debug.Log ("Terrain size: " + terrainData.size); //Correct terrain size

希望这对其他人也有帮助!

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2015-07-17
    • 2011-06-13
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多