Текстуры ландшафта

Speed Tree : Terrain & Trees.

Текстуры ландшафта

Сообщение EvgeniyT 18 янв 2011, 20:26

Создал Terrain, далее в "Set Resolution" установил "Terrain Width" и "Terrain Length" равными 3. Создал 2 разные текстуры, разрисовал Terrain (произвольным образом), после этого написал слудующий скрипт и прикрепил его в к террайну:

Синтаксис:
Используется csharp
Terrain terrain = GetComponent<Terrain>();

float[, ,] alphamaps = terrain.terrainData.GetAlphamaps(0, 0, (int)terrain.terrainData.Size.x, (int)terrain.terrainData.Size.z);

for(int x = 0; x < (int)terrain.terrainData.Size.x; x++)
  for(int z = 0; z < (int)terrain.terrainData.Size.z; z++)
    print(alphamaps[z, x, 0]);
 


Лично я насчитывал получить от такого скрипта 9 чисел типа float, которые соответствуют степени интенсивности текстуры под индексом 0 в точках (00),(01)....(21),(22)
Но получаю я совершенно другое: на консоль выводится 9 раз число, соответствующее интерсивности текстуры с индексом 0 в точке(00).
Где-то я наверняка ошибаюсь? :-?
EvgeniyT
UNIт
 
Сообщения: 142
Зарегистрирован: 14 дек 2010, 19:06
  • ICQ

Re: Текстуры ландшафта

Сообщение Ert Donuell 18 янв 2011, 21:19

Я бы написал вот так:
Синтаксис:
Используется csharp
Terrain terrain = GetComponent<Terrain>();
float[,,] alphamaps;

for(int x = 0; x < (int)terrain.terrainData.Size.x; x++)
  for(int z = 0; z < (int)terrain.terrainData.Size.z; z++) {
    alphamaps[x, z, 0] = terrain.terrainData.GetAlphamaps(x, z, (int)terrain.terrainData.Size.x, (int)terrain.terrainData.Size.z);
    print(alphamaps[z, x, 0]);
}
 

;)
Последний раз редактировалось Ert Donuell 18 янв 2011, 23:04, всего редактировалось 5 раз(а).
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Текстуры ландшафта

Сообщение EvgeniyT 18 янв 2011, 22:47

Даже если не брать в расчёт, что при таком коде x*z раз выведется запить типа "System.Single[, ,]", то я не особо понял, как получить из такого цикла массив точек и текстур? По-идее должен получиться один 3х мерный массив, котором индексы - [z, x, TextureIndex]. Где-то я такое видел, но сейчас сталкнулся с этой проблемой.
Как воспользоваться Вашим советом, так и не понял.
EvgeniyT
UNIт
 
Сообщения: 142
Зарегистрирован: 14 дек 2010, 19:06
  • ICQ

Re: Текстуры ландшафта

Сообщение Ert Donuell 18 янв 2011, 23:02

Случайно вместо нового ответа исправил свой предыдущий пост)
Не посмотрел описание функции, т.е. возвращаемое значение. [curved_hands]
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: Текстуры ландшафта

Сообщение alexz 19 янв 2011, 02:09

EvgeniyT писал(а):Создал Terrain, далее в "Set Resolution" установил "Terrain Width" и "Terrain Length" равными 3.

Это ты установил физические размеры в мировых единицах. Получилась поверхность 3х3 метра. К размерам alphamaps это не имеет отношения; там размеры равны степени двойки: ...128/256/512/1024...

Лично я насчитывал получить от такого скрипта 9 чисел типа float, которые соответствуют степени интенсивности текстуры под индексом 0 в точках (00),(01)....(21),(22)

Ты их и получил - 9 маленьких ячеек в самом уголке карты.

Синтаксис:
Используется csharp
Terrain terrain = GetComponent<Terrain>();

int size = terrain.terrainData.alphamapResolution;
float[,,] alphamaps = terrain.terrainData.GetAlphamaps(0, 0, size, size);
 

Вот теперь в 3-мерном массиве alphamaps лежит вообще вся информация о нанесении текстур.
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37

Re: Текстуры ландшафта

Сообщение EvgeniyT 19 янв 2011, 07:56

В общем-то работает, спасибо, но возникает ряд вопросов:

1) Всё таки не особо понял, что же тогда такое Terrain Width и Terrain Length? И что, в таком случае, означает Tile Size X и Tile Size Y в настройках текстуры у Terrain? Я заметил, что если сделать размер террайна равным 3*3, а для текстуры 1*1, то как раз получится ровно 9 полных квадратиков с текстурой.

2) Что такое alphamapResolution? Какого бы размера Terrain я не сделал, у меня это число получается равным 512. Даже если размер будет 3*100.

3) Получается, что метод GetAlphamaps возвращает массив, в котором находятся интенсивности каждой текстуры для каждой точки (типо как пикселя) террайна?
EvgeniyT
UNIт
 
Сообщения: 142
Зарегистрирован: 14 дек 2010, 19:06
  • ICQ

Re: Текстуры ландшафта

Сообщение alexz 19 янв 2011, 14:06

Вот, есть обзор настроек террайна: http://www.unifycommunity.com/wiki/inde ... n_tutorial

Terrain Width, Terrain Length ― физические ширина и длина в реальных метрах. Если поставить 3х3, то на таком террейне даже дереву будет негде упасть.

Terrain Heights ― максимальная высота в реальных метрах. Поверхность строится на основе карты высот. Карта высот заполнена числами от 0,0 до 1,0. Ноль соответствует нижней точке поверхности, а единица ― максимальной высоте, т.е. Terrain Height.

Tile Size X и Tile Size Y размеры текстуры в метрах. Чем меньше её размеры, тем большее число раз она повторится по всей поверхности.

Изображение
Terrain Width = Terrain Length = 100м
Tile Size X = 100м
Tile Size Y = 100м

Изображение
Terrain Width = Terrain Length = 100м
Tile Size X = 50м
Tile Size Y = 200м

terrain.terrainData.alphamapResolution или Control Texture Resolution
Чем больше, тем более аккуратные можно сделать переходы между текстурами. От физических размеров поверхности никак не зависит.

Изображение
alphamapResolution = 32

Изображение
alphamapResolution = 512

3) Получается, что метод GetAlphamaps возвращает массив, в котором находятся интенсивности каждой текстуры для каждой точки (типо как пикселя) террайна?

Да.
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37

Re: Текстуры ландшафта

Сообщение EvgeniyT 19 янв 2011, 19:56

Спасибо! Вы мне сильно помогли!
EvgeniyT
UNIт
 
Сообщения: 142
Зарегистрирован: 14 дек 2010, 19:06
  • ICQ

Re: Текстуры ландшафта

Сообщение EvgeniyT 19 янв 2011, 20:05

Так а если у меня Terrain размером 3*3, alphamapResolution равно 512, сколько точек вернёт метод GetAlphamaps( )?
3*3*512 - столько?
EvgeniyT
UNIт
 
Сообщения: 142
Зарегистрирован: 14 дек 2010, 19:06
  • ICQ

Re: Текстуры ландшафта

Сообщение alexz 19 янв 2011, 21:21

EvgeniyT писал(а):Так а если у меня Terrain размером 3*3, alphamapResolution равно 512, сколько точек вернёт метод GetAlphamaps( )?
3*3*512 - столько?


Синтаксис:
Используется csharp
int alphamapResolution = terrain.terrainData.alphamapResolution;
int alphamapLayers = terrain.terrainData.alphamapLayers;

float[, ,] alphamaps = terrain.terrainData.GetAlphamaps(0, 0, WIDTH, LENGTH);
 


alphamaps будет размером WIDTH * LENGTH * alphamapLayers, при условии, что WIDTH и LENGTH не превышают alphamapResolution.

Размеры/габариты террейна не влияют ни на что. Только на внешний вид.
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37

Re: Текстуры ландшафта

Сообщение EvgeniyT 19 янв 2011, 21:32

Я что-то сейчас не очень понял, что тут такое WIDTH и LENGTH. В прошлый раз Вы передавали методу GetAlphamaps в качестве 2х последних параметра одинаковое число alphamapResolution. А теперь появились какие-то WIDTH и LENGTH.
Насколько я понял, первые 2 параметра - что-то типо с какой точки начинаем. А последние 2 параметра за что отвечают?

И какую роль играет terrain.terrainData.alphamapLayers?
EvgeniyT
UNIт
 
Сообщения: 142
Зарегистрирован: 14 дек 2010, 19:06
  • ICQ

Re: Текстуры ландшафта

Сообщение alexz 19 янв 2011, 22:05

http://unity3d.com/support/documentatio ... ayers.html
TerrainData.alphamapLayers

var alphamapLayers : int

Description
Number of alpha map layers

Количество слоёв альфакарты. Количество текстур, которыми разрисовывается поверхность.

http://unity3d.com/support/documentatio ... amaps.html
TerrainData.GetAlphamaps

function GetAlphamaps (x : int, y : int, width : int, height : int) : float[,,]

Description
Returns the alpha map at a position x, y given a width and height

GetAlphamaps выдёргивает для нас кусок из альфакарт поверхности. Максимум, что мы можем получить, ― это все альфакарты целиком:
GetAlphamaps(0, 0, alphamapsResolution, alphamapsResolution)

Если целиком не надо, можно получить только нужный кусок:
GetAlphamaps(x, y, width, length)
x, y ― координаты, где желаемый кусок начинается;
width, length ― его ширина и длина.

---
Проводя анологию, Terrain Width и Terrain Length (или terrain.terrainData.size.x и terrain.terrainData.size.z) ― это габаритные размеры твоего монитора, а Control Texture Resolution (или terrain.terrainData.alphamapsResolution) ― это разрешение экрана, которое ты себе установил. Разрешение экрана не зависит от габаритов монитора, а габариты монитора не зависят от разрешения экрана.
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37

Re: Текстуры ландшафта

Сообщение Steelclad 16 фев 2011, 13:31

Все думаю как удобнее сделать bumpmaping на терайне.
Порылся TerrainEngine.cginc , там только трава и деревья.
Может кто знает как Unity текстуру терайна выводит? Наверное заранее смешивает их и выводит уже как единую? Или он их уже в процессе смешивает в шейдере?
Было бы хорошо вмешаться в этот процесс и к каждой текстуре приложить normalmap и потом их апроксимировать, согласно данным о наложении текстур в данной точке.
Хочется именно рисовать по терайну, а не класть на него цельные текстуры для того чтобы добиться бампмэпинга
Если кто знает куда вклинится буду благодарен.
MATRIX HAS YOU,...Knock,knock...
Аватара пользователя
Steelclad
UNец
 
Сообщения: 41
Зарегистрирован: 03 ноя 2010, 16:08


Вернуться в Земля и деревья.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1