Почему назначение heightmapResolution увеличивает размер моего ландшафта?

Итак, я пытался сгенерировать ландшафт с помощью кода и столкнулся с проблемой. Когда я назначаю heightmapResolution, размер моего ландшафта увеличивается в степени, равной степени двойки.

Например, если мое разрешение карты высоты равно 513, то размер моего ландшафта увеличивается в 16 раз. Если мое разрешение карты высоты равно 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);
            }
        }

Итак, это блок, который генерирует мои TerrainData. Изменение размера ландшафта уже видно в Debug.Log ("Большой размер ландшафта: " + terrainData.size); сразу после того, как я назначу heightmapResolution.

Любые идеи относительно того, почему это происходит?


person Pizmovc    schedule 17.04.2015    source источник
comment
Вы использовали отладчик?   -  person Varaquilex    schedule 18.04.2015
comment
Я понял это и разместил свой ответ ниже. Я использовал отладчик и просто пробовал разные вещи, пока это как-то не сработало.   -  person Pizmovc    schedule 18.04.2015
comment
Я предполагаю, что это происходит потому, что Unity пытается изменить масштаб ландшафта при установке heightmapResolution, чтобы сохранить фактическое разрешение вывода? (Просто мысль)   -  person vatbub    schedule 14.08.2017


Ответы (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

Надеюсь, это поможет кому-то еще!

person Pizmovc    schedule 18.04.2015