Снова вопросы про большие терейны

Speed Tree : Terrain & Trees.

Снова вопросы про большие терейны

Сообщение Woozle 04 фев 2010, 11:36

Извиняюсь за возможный оффтоп, но изучение предыдущих тем полной ясности не принесло.
Стоит задача получить интерактивную территорию 32*32 км для дизайнерских целей. Познания в Юнити минимальны, знание в сфере скриптинга стремится к нулю.
В наличии хейтмапа (png 16 bit) 8193*8193. Разрезаю ее (Фотошоп CS4, слева направо, сверху вниз) на 256 кусков 513*513 в соответствии с бесшовной технологией (viewtopic.php?f=19&t=689#p7084). Каждый кусок сохраняю в RAW для импорта в Юнити.
Вопрос 1. При импорте хейтмапов (терейны 1-16, смещение каждого последующего по оси х на 2000) замечаю, что территория получается в зеркальном отображении. Выход прост, перед сохранением куска хейтмапы в RAW делаю отображение текстуры по вертикали, в результате получаю нормальный вид. Это мой глюк или некое закономерное явление в связке Фотошоп-Юнити?
Полученный набор террейнов в Юнити бесшовным никак не выглядит. Использую first person controller для рассмотрения вблизи. С максимально близкого расстояния шва не видно, он появляется при удалении на 5 метров и больше.
Понятно, что необходимо использовать Terrain.setNeighbors. Я понимаю, в чем смысл этой функции, понимаю, что она делает (читал форум), мне более-менее понятен код скрипта и как его модифицировать для 256 терейнов.
Вопрос 2. Я не знаю, как заставить скрипт работать. Куда его вставлять и к чему прикреплять? Понятно, что "ПРименить функцию нужно абсолютно ко всем террейнам сетки." Но ведь это скрипт должен применить функцию ко всем терейнам? Единственное, что нашел на офф. форуме "basic script you can assign to a general management object in your scene and assign 4 aligned terrain blocks to it." Что это за общий управляющий объект в сцене и каким образом можно ему назначить этот скрипт? И каким образом назначить терейны этому скрипту (они ведь уже прописаны в самом скрипте)?
Вопрос 3. Для сеттинга терейнов в такой локации хорошо было бы использовать скрипт Neodrop'а Wizard. SetTerrainPosition (viewtopic.php?f=69&t=329#p1762). Опять же, как технически это делается?
Извиняюсь за идиотизм вопросов, но уже сутки копаюсь в документации, туториалах, инете и бестолку. 3D Platformer я обязательно пройду, как только появится время:) Если тему удалят за оффтоп и вопиющее ламерство, не обижусь. Просто этот вопрос со скриптом как зубная боль, достал уже.
Аватара пользователя
Woozle
UNец
 
Сообщения: 13
Зарегистрирован: 16 ноя 2009, 03:25
Откуда: Воронеж

Re: Снова вопросы про большие терейны

Сообщение Neodrop 04 фев 2010, 12:14

[V] 1 : Скорее всего у вас появляются дырки от того, что параметр Pixel Error в настройках террейна высоковат, а так же, именно из-за того, что не включен Terrain.setNeighbors()
[V] 2 : Terrain.setNeighbors применять нужно к каждому террейну и к 4 его соседям. То есть, вешаем на террейн и указываем ему кто справа (по оси Х), кто впереди (по оси Z), сзади (-Z) и слева (-Х) и так для каждого террейна в сетке. Если справа-слева-сзади-спереди кого то нет (террейн крайний или угловой в сетке), то указываем null
Руками это делать запарно, а как организовать автоматику, это вам любой кодер объяснит. Не рекомендовал бы возиться с [unity 3D] Unity, вообще не умея программировать.
[V] 3 : Мой Wizard работает так (дай Бог памяти...) : Main Terrain - это террейн, относительно которого вы будете позиционировать Add Terrain. Указываем оба в настройках и выбираем кнопочку положения. Up - это вперёд по оси Z и Right - это вправо по оси Х, ну и так далее.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Снова вопросы про большие терейны

Сообщение Garu 04 фев 2010, 13:42

Чууутку оффтопа, а в чем изначально терру делал, ну и можно ли на нее взглянуть? Или же просто где-то нашел хаймап? ГеоКонтрол2 юзал для своего, но с некоторыми вещами там возникли проблемки...
Аватара пользователя
Garu
UNITрон
 
Сообщения: 199
Зарегистрирован: 13 авг 2009, 18:26

Re: Снова вопросы про большие терейны

Сообщение Woozle 04 фев 2010, 15:23

Базовый вариант делал в EarthSculptor 1.05, модифицировать буду в GeoControl2. С последним пока еще не работал, если возникнут проблемы и решения, отпишусь. Саму терру собираю-пересобираю (больше, правда, читаю мануалы:), покажу позже.
Аватара пользователя
Woozle
UNец
 
Сообщения: 13
Зарегистрирован: 16 ноя 2009, 03:25
Откуда: Воронеж

Re: Снова вопросы про большие терейны

Сообщение Woozle 04 фев 2010, 17:14

Neodrop писал(а):[Terrain.setNeighbors применять нужно к каждому террейну и к 4 его соседям. То есть, вешаем на террейн и указываем ему кто справа (по оси Х), кто впереди (по оси Z), сзади (-Z) и слева (-Х) и так для каждого террейна в сетке. Если справа-слева-сзади-спереди кого то нет (террейн крайний или угловой в сетке), то указываем null.

Neo, если я правильно Вас понял, к каждому терейну необходимо приаттачить скрипт вида (стащил с оф. форума, да и здесь он есть):
Код: Выделить всё
using UnityEngine;
using System.Collections;

public class TerrainTiler : MonoBehaviour {

   public Terrain[] terrains;
   void Start () {
      terrains[0].SetNeighbors( null, null, terrains[1], terrains[16] );
//слева, сверху, справа, снизу - scripting reference: function SetNeighbors (left : Terrain, top : Terrain, right : Terrain, bottom :Terrain) : void
   }
   void Update () {
   }
}

Это для первого терейна в сетке
000 ... 015
016 ... 031
032 ... 047
и т.д.

а для восемнадцатого (017), скажем:
Код: Выделить всё
using UnityEngine;
using System.Collections;

public class TerrainTiler : MonoBehaviour {

   public Terrain[] terrains;
   void Start () {
      terrains[0].SetNeighbors( terrains[16], terrains[1], terrains[18], terrains[33] );
   }
   void Update () {
   }
}

Так? Если так, то даже 256 подобных процедур меня не страшат:)
Однако консоль выдает ряд сообщений о синтаксических ошибках, вроде:
Assets/New Folder/000setNeighborsScript.js(4,42): UCE0001: ';' expected. Insert a semicolon at the end.
И другие.
То есть что-то не так с самим скриптом? Или есть какие-то более простые формы использования Terrain.setNeighbors?
Или же следует написать скрипт с массивом из 256 функций и приаттачить его ко всем терейнам?

P.S. В свойствах терейнов pixel error=5. Стоит ли его понижать?
P.P.S. Юнити привлекает своей логичностью и эстетикой, своего рода стройностью. Я две недели читал обзоры и материалы по движкам и редакторам. На Юнити попал совершенно неожиданно, можно сказать, по рекомендации со случайного форума. Симпатия с первого взгляда:) Ну и сообщество забавное:) А программирование в необходимых основах придется освоить, ничего не поделаешь.
Аватара пользователя
Woozle
UNец
 
Сообщения: 13
Зарегистрирован: 16 ноя 2009, 03:25
Откуда: Воронеж

Re: Снова вопросы про большие терейны

Сообщение Neodrop 04 фев 2010, 17:46

Ошибка говорит, что где то нет запятой.
Вот, гарантированно рабочий скрипт :

(js) NeoSetTerrainNeighbors.js
Код: Выделить всё
//Created by Neodrop
//neodrop@unity3d.ru

@script ExecuteInEditMode()

var left : Terrain;
var top : Terrain;
var right : Terrain;
var bottom : Terrain;

var dinamic : boolean = false;

private var terr : Terrain;


function Start () {
   terr = GetComponent(Terrain);
   SetNeoNeighbors();
}

function FixedUpdate()
{
   if (dinamic) SetNeoNeighbors();
}

@ContextMenu ("SetNeoNeighbors")
function SetNeoNeighbors()
{
   terr.SetNeighbors (left, top, right, bottom);
}

RequireComponent (Terrain);


Если террейны идут по порядку сеткой такого вида :
|0|1| 2 | 3 |
|4|5| 6 | 7 |
|8|9|10|11|

То, следовательно, для террейна 0 :
..|--|
--|0|1|
..|4|
Прочерки это null
А для террейна 6 :
...| 2 |
|5| 6 | 7 |
...|10|

Ну неужели не понятно ? :-?

pixelError ни в коем случае не делать меньше. Но, если не сделали SetNeighbors, то pixelError = 0 и дырки ваши пропадут. Но зато появятся нешуточные тормоза.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Снова вопросы про большие терейны

Сообщение Woozle 04 фев 2010, 20:32

Neo, огромное Вам, нечеловеческое спасибо!:)
Что касается нумерации соседних терейнов, то все было понятно. Я так и писал: null, null, 1, 16 - для 0.
Попутно, еще один вопрос: из соображений производительности, имеются ли ограничения на количество терейнов в одной сцене? Если да, то какие?
Аватара пользователя
Woozle
UNец
 
Сообщения: 13
Зарегистрирован: 16 ноя 2009, 03:25
Откуда: Воронеж

Re: Снова вопросы про большие терейны

Сообщение Neodrop 04 фев 2010, 21:58

Нету. Если только не поставите дистанцию видимости в 50 километров.
Ну, в разумных пределах "нету" конечно. Более 9 единовременно (чтобы составили квадрат с активным террейном в центре) это извращение.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Снова вопросы про большие терейны

Сообщение skynet 09 фев 2010, 12:38

может вопрос уже и закрыт, но как я понимаю, ему необходимо террайн 32х32 км и того кусков 4х4=16 террайнов (если брать по 8192) без асинхронной загрузки тут уже не обойтись.
для загрузки хейтмапы использовал GDal + streamingWorldDemo как пример загрузки асинхнронно терайнов. Все получилось без швов и что на близко, что на далеком растоянии никаких побоынчх эффектов не заметил.

А теперь и я задам вопросик, может кто подскажет как это правильно реализовать:
предисловие:
из готового на данный момент это
+1) загрузка хейтмапы, создание по ней террайна
+2) загрузка 8битного RGB изображения и вытаскивание из него информации про где какую текстуру рисовать (ну хз как правильно описать)
+3) добавление к террайну текстур, создание сплатмасок и добавление их к террайну (само собой все кодом без эдитора)
-4) на этапе создания по маскам деревьев и их расстановки пока завис...
суть проблемы:
к террайну добавляю ТreePrototypes(в эдиторе вижу, что есть деревья в списке), добавляю TreeInstances, пересчитываю позицию деревьев НО ничего не происходит они не расставляются, а вот если через эдитор добавлю к террайну еще одно дерево, тогда все срабатывает и я сразу же после apply вижу их на ландшафте
Новый террайн_тулз еще не смотрел, но всеравно думаю там многие проблемы не решатся...
The Truth Is Out There!
Аватара пользователя
skynet
UNец
 
Сообщения: 11
Зарегистрирован: 11 янв 2010, 11:12

Re: Снова вопросы про большие терейны

Сообщение gnoblin 09 фев 2010, 15:43

А что такое GDal?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Снова вопросы про большие терейны

Сообщение skynet 09 фев 2010, 15:57

GDAL --- это библиотека для работы с растровыми географическими форматами файлов данных.
В проге Global Mapper загрузил топографию реальной местности...и сохранил в tiff хейтмапы и карту цветов для текстурирования...
для загрузки можно и либо что другое использовать...просто оно одной функцией от начало до конца считывает файлик и помещает в буфер
The Truth Is Out There!
Аватара пользователя
skynet
UNец
 
Сообщения: 11
Зарегистрирован: 11 янв 2010, 11:12

Re: Снова вопросы про большие терейны

Сообщение Neodrop 09 фев 2010, 17:02

Дык террейн обновить нужно, после добавления объектов. Flush вроде.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Снова вопросы про большие терейны

Сообщение skynet 09 фев 2010, 17:27

Edit: palmface .... есть всетаки функция Flush()...

добавлял через скрипт эдитора, поэтому после добавления деревьев заюзал Terrain.activeTerrain.Flush()
и о чудо - обновилось...
спасибо, Neodrop.
Последний раз редактировалось skynet 09 фев 2010, 17:46, всего редактировалось 2 раз(а).
The Truth Is Out There!
Аватара пользователя
skynet
UNец
 
Сообщения: 11
Зарегистрирован: 11 янв 2010, 11:12

Re: Снова вопросы про большие терейны

Сообщение Neodrop 09 фев 2010, 17:39

Terrain.Flush()
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Снова вопросы про большие терейны

Сообщение StalkerOnix 18 июл 2012, 08:25

Скриптом создаю область из террайнов с накладкой в 1 юнит, применяю SetNeighbors, но в итоге при удалении от стыков получается такой эффект
Изображение

создаются терайны в таком порядке:
Z
| 6 7 8
| 3 4 5
| 0 1 2
0 - - - X
в SetNeighbors для 4 террайна левым будет 3, правым 5....?
StalkerOnix
UNец
 
Сообщения: 10
Зарегистрирован: 13 фев 2012, 10:28

След.

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

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

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