Страница 1 из 1

Динамическое создание ландшафта

СообщениеДобавлено: 10 дек 2010, 12:52
stepnoy
Господа, у меня пара нубских вопросов.

Есть ли возможность создавать динамически ландшафт из карты высот и набора текстур во время игры? И как это можно сделать?

Можно ли его в последствии изменять (например воронка от взрыва)?

Re: Динамическое создание ландшафта

СообщениеДобавлено: 10 дек 2010, 13:08
Zaicheg
Пока что могу посоветовать только ручное создание меша (класс Mesh) по карте высот. То есть, берём пиксель карты высот (Texture2D.GetPixel), фигачим вершину в соответствии с цветом (Mesh.vertices), после вершин задаём Mesh.uv, формируем Mesh.triangles, назначем полученный меш на MeshFilter геймобъекта. По нормалям может Mesh.RecalculateNormals обойдётесь. Про RecalculateBounds тоже не забываем.

Плюс написать шейдер, накладывающий текстуры, пример (по макске) тут:
viewtopic.php?f=35&t=2927

По-моему, вполне реально.

Что касается воронки от взрыва -- всё тоже самое, опеределяете вертексы в зоне взрыва, смещаете, пересчитываете нормали. Просто поэкспериминтируйте.
У Неодропа есть деформатор -- можно спросить конкретно у него.

Re: Динамическое создание ландшафта

СообщениеДобавлено: 10 дек 2010, 19:44
alexz
Синтаксис:
Используется csharp
...
var terrainData = terrain.terrainData;
int size = terrainData.heightmapWidth; // Карта высот квадратная ― ширина и высота одинаковые

float[,] heights = terrainData.GetHeights(0, 0, size, size); // Достаём из Terrain'а карту высот целиком
GenerateHeightmaps(heights, size); // Совершаем с картой высот какое-нибудь непотребство
terrainData.SetHeights(0, 0, heights); // Запихиваем модифицированную карту высот обратно в Terrain

var terrainToolkit = terrain.GetComponent<TerrainToolkit>();
terrainToolkit.textureTerrain((titleString, displayString, percentComplete) => { }); // Используем TerrainToolkit, чтобы автоматически раскрасить Terrain нужными текстурами
...
 

Карту высот можно изменить в любой момент. Можно целиком, можно по кусочкам, указывая координаты и размер кусочка при вызове методов GetHeights и SetHeights. Я экспериментировал, заметил, что модификация карты высот работает шустро, только когда рядом нет травы. Если была трава, всё на полсекунды подвисало.

PS
Не, не на полсекунды виснет, а на пару десятых, но всё равно заметно. Вот моя площадка для экспериментов ― остров с динамически генерируемым ландшафтом. Правой кнопкой мыши можно делать в земле корявые ямки.

HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://dl.dropbox.com/u/8203557/island.unity3d&w=600&h=400&t=false&preview=1' height='"+(400+30)+"' width='600' frameborder='0' scrolling='no'></iframe>"); </script>

Re: Динамическое создание ландшафта

СообщениеДобавлено: 11 дек 2010, 03:00
gnoblin
еще было бы полезно отключить выпадающее меню в вебплеере по правому клику :p

Re: Динамическое создание ландшафта

СообщениеДобавлено: 11 дек 2010, 14:27
Neodrop
Это в теге отключается. Я подправил.