W trakcie tych zajęć skupimy się na tworzeniu krajobrazów z wykorzystaniem pakietu Terrain Tools i darmowych assetów dostępnych w sklepie unity. W pierwszej części skupimy się na ręcznym kształtowaniu terenu. Z tematem można sie zapoznać także korzystając z licznych tutoriali np tym lub tym.
Do odtworzenia wyników z zajęć w nowym projekcie wymagany jest pakietu Terrain Tools, który jest w wersji preview, żeby go pobrać najpierw trzeba ustawić wyświetlanie tych pakietów w menadżerze. Poza tym potrzebne będą assety terenu, można wykorzystać te, które są dostępne jako przykładowe albo znaleźć inne (można na przykład pobrać jakieś darmowe sceny i ukraść z nich assety do celów edukacyjnych) lub zrobić je samemu.
Obok zakładki Inspector powinna być zakładka Terrain Toolbox, która służy do zarządzania obiektami terenu. Jeżeli jej tam nie ma, możesz ją znaleźć pod opcją Window > Terrain > Terrain Toolbox
. Zaznacz Create New Terrain, powinno się pojawić poniższe okno:
ustaw wymiary (szerokość wysokość i długość) terenu wedle własnego uznania, domyślnie jest to 500 na 500 na 600, ale dla oszczędzenia mocy obliczeniowej systemu w dalszych punktach zalecam ograniczyć się do 100 na 100 na 200. (Te opcje można też później zmienić w ustawieniach terenu lub globalnie dla wszystkich terenów w Terrain Toolbox > Terrain Settings
.) Pozostaje stworzyć teren za pomocą przycisku Create na dole okna
Stworzony teren pojawi się w postaci płaskiej szachownicy w widoku sceny i w hierarchii wewnątrz grupy terenów
Teraz skupimy się na opcjach jakie możliwości oferuje teren jako komponent terenu. Przełącz się na zakładkę Inspector i zaznacz teren. W inspektorze możesz zobaczyć szereg opcji jakie teren oferuje pogrupowanych w zakładki.
Interesujące nas części to:
Kształt terenu jest opisywany przez heightmapę. Czyli maskę, której jasność oznacza wysokość terenu. Ta jest interpretowana przez unity i przetwarzana na mesh. Dzięki temu podejściu projektant nie musi martwić się o geometrię terenu, która jest generowana przez silnik. Wadą jest, że wszelkie wypukłości i lub jaskinie muszą być obsługiwane w inny sposób.
Tworzenie sceny zaczniemy od wyrzeźbienia powierzchni terenu. Przejdź do zakładki Malowanie terenu. Pod paskiem z zakładkami jest lista rozwijana, w której można wybrać tryby malowania. Poniżej listy jest pole tekstowe, które opisuje co robi i dana opcja. Pod nią opcje pędzla, przede wszystkim można wybrać jakiego pędzla chce się używać, poza tym można modyfikować jego parametry, czyli rozmiar siłę, nacisku i spacing. Można dodawać swoje własne pędzle. Jeszcze niżej są opcje poszczególnych trybów - istotniejsze są omówione poniżej.
Do formowania terenu interesuje nas pierwsze pięć i ostatnie cztery opcji, są to:
Sculpt - zbiór narzędzi związanych z rzeźbieniem, należą do nich:
Effects - Różnego rodzaju efekty.
Erosion - różne rodzaje erozji
Mesh Stamp - pozwala odcisnąć mesh znajdujący się w assetach projektu.
Raise or Lower Terrain - podnosi lub opuszcza teren, główne narzędzie przy formowaniu.
Transform - ściskanie, przesuwanie i obracanie.
Set Height - ustawia teren na wpisanej przez użytkownika wysokości.
Smooth Height - wygładza teren.
Poza tym można dodawać filtry na maski modyfikując ich możliwości.
Przydatne skróty:
Nim zaczniesz modelować teren dodaj jakiś obiekt, który będzie służył za punkt odniesienia, na przykład model postaci albo jakąś figurę geometryczną. Model wykorzystany w trakcie zajęć pochodzi stąd.
wybierz jeden z krajobrazów znajdujących się w folderze landscapes
i wymodeluj teren nimi inspirowany. Zdjęcia nie będą punktem odniesienia w ocenianiu. służą jedynie jako inspiracja do zrobienia terenu.
Gdy skończysz, przenieś kamerę w miejsce docelowe. Możesz założyć, że scena jest statyczna, to znaczy, kamera się nie porusza. Zaznacz kamerę i użyj Ctrl+Shift+F
by ustawić kamerę z widokiem sceny.
Tekstury terenu są jak cebula, mają warstwy
Na teren nakłada różne tekstury odpowiadające za rożne rodzaje powierzchni, takie podejście pozwala uniknąć monotonii i czyni teren bardziej atrakcyjnym. Osiąga się to za pomocą palety warstw oraz splatmapy, która opisuje z jakimi parametrami silnik ma mieszać warstwy.
By przejść do teksturowania, należy wybrać opcję Texture Paint dostępną w rozwijanym menu.
Pierwszym krokiem jest stworzenie lub wczytanie palety tekstur, które będą nakładane na teren. Ustawienia palety znajdziemy w zakładce Layers.
Gotowe warstwy można dodać za pomocą przycisku Add Layer a nowe za pomocą Create. Jednak tutaj trzeba wziąć pod uwagę, że dodaje się tylko teksturę, która odpowiada za kolor, pozostałe trzeba dodać do warstwy ręcznie.
Warstwa terenu składa się z 3 tekstur:
Nie ma potrzeby, żeby wszystkie tekstury znalazły sie w warstwie, zalecane jest, żeby były przynajmniej dwie pierwsze.
Kolejność tekstur w palecie można swobodnie zmieniać, ale najlepiej ustalić ją na początku. Tekstury są indeksowane w splatmapie po ich kolejności w palecie, więc zmiana jej w trakcie malowania spowoduje nieprzewidziane w efekcie końcowym.
Warstwy podobnie jak materiały można skalować za pomocą opcji tilling, z jednej storny pozwoli to na dopasowanie ich do sceny, z drugiej, stworzenie kilku warstw różniących się tylko tym parametrem może być dobrym sposobem na szybkie urozmaicenie sceny
Pierwsza warstwa od góry jest tą domyślną, więc umieść ją na szczycie. Kolejność pozostałych nie ma znaczenia, póki nie zaczniesz nakładać ich na teren. Tekstury nakładasz wybierając teksturę i pędzel, następnie nakładasz ją na teren kliknięciami i pociągnięciami myszki. Spróbuj różnych ustawień pędzla. Przykładowo zwiększenie wartości Brush Scatter, Brush Spacing i Jitter i użycie nieregularnego pędzla da efekt rozrzucenia plam w losowych miejscach.
Utwórz paletę korzystając z dostępnych warstw i tekstur. Następnie wykorzystaj ją do oteksturowania swojego terenu. Dodaj do swojego krajobrazu jakąś ścieżkę i nadaj jej odpowiednie tekstury.
Zanim zaczniemy dodaj do kamery skrypt
Simple Camera Controller
, ułatwi on poruszanie się w scenie
Kolejne narzędzie służy do rozmieszczania drzew i innych większych elementów krajobrazu.
Nowy rodzaj drzew dodaje się za pomocą Edit Trees > Add Trees
, opcje w Edit Trees służy także do zmiany modelu drzewa czy usuwaniu rodzaju drzewa.
Poniżej są suwaki odpowiadające za opcje ustawiania drzew. Dwa pierwsze modyfikują rozmiar i gęstość pędzla. kolejne odpowiadają za dostosowanie wielkości drzew. Opcja Lock Width to Height uzależnia szerokość drzewa od wysokości. Jej wyłączenie zwiększy różnorodność drzew, ale może prowadzić do niepożądanych efektów, przy źle dobranych parametrach.
Można też umieścić drzewa losowo za pomocą Mass Place Trees
, gdzie użytkownik może wybrać ile drzew ma się pojawić, a te zostaną umieszone losowo w scenie.
Kolejna zakładka służy do dodawania detali, jak trawa i rośliny polne. Jest bardzo podobna do tej od drzew. Podobnie za pomocą Edit Details można dodać edytować lub usuwać detale. Dodatkowo jest opcja Add Grass Texture
, która pozwala dodać teksturę jako bilboard. Działanie pierwszego suwaka odpowiada za wielkość pędzla. Natomiast trzeciego za maksymalną ma być na tym terenie, a drugi za tępo w jakim tą wielkość się osiągnie. Jakby to porównać do malowania, to Target Strength by odpowiadało za siłę nasycenia, ale Opacity za siłę krycia.
Poniżej jest okno jakie się pojawia przy dodawaniu/edytowaniu detalu. Można w nim dostosować rozmiar, żeby zgadzał się z rozmiarem reszty obiektów w scenie. Wartości kolorów odpowiadają za modyfikacje odcienia detali w zależności od położenia, by nadać im większą różnorodność. Warto dopasować wartości kolorów, Healthy Color z reguły powinien być biały, natomiast Dry Color nie powinnien zbytnio odbiegać od oryginalnego koloru obiektu.
Narzędzia terenu same w sobie się nie nadają na tworzenie ostrych skał czy klifów, by je dodać do sceny lepiej dodać je jako osobne obiekty. Można to zrobić za pomocą systemu drzew, co jednak może dać nierealistyczne efekty lub umieścić je samemu ręcznie.
Druga opcja jest preferowana, gdy chcemy wystającą skałę lub klif umieścić blisko kamery lub w centralnym punkcie naszej sceny. Słabym punktem takiego obiektu jest miejsce połączenia z terenem. Można je zamaskować poprzez dodanie w tym miejscu detali, jak trawa i/lub małe kamyki.
Post processing to zbiór technik wykorzystywanych wykonywanych na wyrenderowanej klatce. Dzięki nim można poprawić wygląd sceny lub dodać efekty jak mgła, bloom czy flary.
Unity oferuje pakiet, który udostępnia podstawowe efekty postprocessingu o nazwie PostProcessing. By go zainicjalizować należy dodać do kamery komponenty Post-Proces Layer
i Post-Proces Volume
. Następnie dodać dodać nową warstwę w Layer > Add Layer...
, nazwij ją Post Processing. Na koniec ustawić warstwę na Post Processing w kamerze i w Post-Proces Layer
.
Teraz wystarczy stworzyć profil w Post-Proces Volume
i dodać do niego komponenty.
Ustaw opcję
Is Global
żeby efekty były widoczne także w widoku sceny
Color Grading - pozwala dostosować kolorystykę sceny, zmodyfikować ekspozycję i kontrast. Do prawidłowego funkcjonowania należy zmienić przestrzeń kolorów na liniową można to zrobić w Edit > Project Settings > Player > Rendering > Color Space
.
Ambient Occlusion - dodaje okluzję otoczenia, czyli zacienienie dla światła rozproszonego wynikającego z geometrii. Zalecane jest wybrać Scalable Ambient Obscurance
jako typ.
Vigniette, Chromatic Aberration, Bloom - efekty symulujące działanie rzeczywistych kamer zwiększają filmowość obrazu.
Motion Blur - rozmycie w ruchu, nada więcej realizmu ruchom trawy i gałęzi.
Znajdź w internecie model domku lub innego budynku i zbuduj wokół niego scenę przedstawiającą go na odludziu w otoczeniu przyrody. Wymodeluj teren, dodaj drzewa, trawę i inne detale, wykorzystaj post-processing. Możesz wykorzystać assety znajdujące się w projekcie lub ściągnąć własne. Postaraj się, żeby teren wyglądał estetycznie. Efekt końcowy może być statycznym ujęciem, w takim przypadku umieść kamerę w odpowiednim miejscu.
Teksturowanie można częściowo zautomatyzować uzależniając występowanie warstwę od własności terenu, takich jak wysokość czy kąt nachylenia. Przypomnijmy, że to jaka i w jakim stopniu dana warstwa zostanie narysowana jest dyktowane przez splatmapę. Po stronie skryptu jest to tablica trójwymiarowa, której 2 pierwsze współrzędne to szerokość i wysokość w mapie a trzecia jest indeksem warstwy.
Otwórz Scenę Procedural Terrain
. Wewnątrz znajduje się teren z podpiętym skryptem Procedural Texture Script
, otwórz go w edytorze. Skrypt zawiera funkcję runProcedrualTexturing
, w która ma teksturować teren. W tej chwili przypisuje każdemu punktowi losową wartość i wygląda następująco.
public void runProcedrualTexturing() {
var terrain = gameObject.GetComponent<Terrain>();
var layers = terrain.terrainData.alphamapLayers;
var height = terrain.terrainData.alphamapWidth;
var width = terrain.terrainData.alphamapHeight;
var newSplatMap = new float[width, height, layers];
for (int i=0; i < width;i++) {
for (int j = 0; j < width; j++) {
float x = j / (float)height;
float y = i / (float)width;
var splatWeights = new float[layers];
for (int k = 0; k < layers; k++) {
RandomRange(0.0f,1.0f);
splatWeights[k] = Random.
}float sum = splatWeights.Sum();
for (int k = 0; k < layers; k++) {
newSplatMap[i,j,k]=splatWeights[k]/sum;
}
}
}terrainData.SetAlphamaps(0, 0, newSplatMap);
terrain. }
Przeanalizujmy instrukcje funkcji. Pierwsza pobiera komponent terenu. Następne trzy pobierają odpowiednio liczbę warstw, wysokość i szerokość splatmapy. Linia var newSplatMap = new float[width, height, layers];
tworzy tablicę, która będzie służyć za nową splatmapę. Następnie w pętli przechodzi po wszystkich indeksach splatmapy.
float x = j / (float)height;
float y = i / (float)width;
Powyższe instrukcje dają współrzędne unormowane, które będą przydatne póżniej. Tablica splatWeights
będzie przechowywać wagi warstw.
for (int k = 0; k < layers; k++) {
RandomRange(0.0f,1.0f);
splatWeights[k] = Random. }
Ustawia indeksy na losowe wartości
float sum = splatWeights.Sum();
for (int k = 0; k < layers; k++) {
newSplatMap[i,j,k]=splatWeights[k]/sum; }
Umieszcza wagi w splatmapie i normalizuje je. Suma wag powinna być równa zero, dlatego dzielimy przez sumę tablicy.
terrainData.SetAlphamaps(0, 0, newSplatMap); terrain.
Ustawia nową splatmapę
Zmodyfikuj funkcję tak, żeby teren, który znajduje się wyżej niż snowHeight
był śniegiem a poniżej trawą. Wykorzystaj metodę terrain.terrainData.GetInterpolatedHeight
by uzyskać poziom we współrzędnych x
i y
.
Wykorzystanie zwykłego warunku logicznego da ostre przejście, które wygląda nierealistycznie. Napisz funkcję transition(float start, float end,float value)
która:
I wykorzystaj ją by zrobić bardziej stopniowe przejście
Wykonaj coś podobnego dla tekstury kamieni, teraz zamiast wysokości terenu wykorzystaj kąt nachylenia, możesz go uzyskać za pomocą metody terrain.terrainData.GetSteepness
.