forked from andkok/MWS_2021
cwiczenia 5 trees in environment
This commit is contained in:
parent
b85d37858e
commit
216e6fcfa4
44
Opis.md
44
Opis.md
@ -1,14 +1,14 @@
|
||||
# Trees in environment
|
||||
|
||||
Aby zasymulować środowisko wykorzystamy voxel space. W środowisku będziemy rozpatrywać tylko jedną cechę - zacienienie.
|
||||
W trakcie tych zajęć wykorzystamy *voxel space* do zasymulowania wpływu zacienienia na rozwój drzew.
|
||||
|
||||
## Klasa Environment
|
||||
|
||||
Klasa environment zawiera voxel space z informacją o zacienieniu.
|
||||
Klasa environment znajduje się w `Assets\Scripts\env` i implementuje *voxel space* z informacją o zacienieniu. Zawiera ona następujące metody
|
||||
|
||||
### addShadow
|
||||
|
||||
Funkcja addShadow implementuje metodę shadow propagation. Najpierw zwiększa wartość cienia w zadanej pozycji. Następnie przechodzi w pentlach w dół, zmniejszając z każdym poziomem siłę cienia, ale zwiększając szerokość oddziałowywania.
|
||||
Funkcja addShadow implementuje algorytm shadow propagation. Przyjmuje ona wektor pozycji w przestrzeni świata i siłę zacienienia. Najpierw zwiększa wartość cienia w zadanej pozycji. Następnie przechodzi w pętlach w dół, zmniejszając z każdym poziomem siłę cienia, ale zwiększając szerokość oddziaływania.
|
||||
|
||||
```C#
|
||||
for(int j = (int)voxelPosition.y; j >= 0; j--)
|
||||
@ -27,11 +27,11 @@ for(int j = (int)voxelPosition.y; j >= 0; j--)
|
||||
|
||||
### shadowStrength
|
||||
|
||||
Zwraca siłę cienia w zadanej pozycji
|
||||
Zwraca siłę cienia w zadanej pozycji świata.
|
||||
|
||||
### inVoxelSpace
|
||||
|
||||
Sprawdza, czy dane współrzędne się mieszczą w voxel space
|
||||
Sprawdza, czy dane współrzędne voxela mieszczą się w *voxel space*.
|
||||
|
||||
```C#
|
||||
bool inVoxelSpace(int a, int b, int c)
|
||||
@ -42,6 +42,8 @@ bool inVoxelSpace(int a, int b, int c)
|
||||
|
||||
### positionInVoxel i positionInWorld
|
||||
|
||||
Konwertuje `positionInVoxel` z pozycji w przestrzeni świata do pozycji w przestrzeni *voxel space* `positionInWorld` odwrotnie.
|
||||
|
||||
```C#
|
||||
public Vector3 positionInVoxel(Vector3 positionInWorld)
|
||||
|
||||
@ -66,25 +68,22 @@ bool inVoxelSpace(int a, int b, int c)
|
||||
<img src="images/treesinenvironment/shadowBox.gif" alt="shadowBox" style="zoom:50%;" />
|
||||
|
||||
1. Otwórz Unity Project, wersję na te ćwiczenia. Następnie otwórz scenę "Pipe Model"
|
||||
2. Do objektu shadowBox jest przypięty skrypt Cast Shadow. Otwórz ten skrypt.
|
||||
3. Zmodyfikuj skrypt, tak aby ten obiekt rzucał cień w dół.
|
||||
1. Wykorzystaj funkcję środowiska (Environment)
|
||||
2. public void addShadow(Vector3 position, sbyte strength) // ujemna siła, aby usunąć (Vector3 position to pozycja shadowBox)
|
||||
2. Do obiektu shadowBox jest przypięty skrypt `Cast Shadow`. Otwórz ten skrypt.
|
||||
3. Zmodyfikuj skrypt, tak aby ten obiekt rzucał cień w dół:
|
||||
Skrypt zawiera atrybut `Environment environment`, który obsługuje zacienienie w tej scenie. Wykorzystaj jego metodę `addShadow(Vector3 position, sbyte strength)` by dodać cień w miejscu, w którym znajduje się obiekt. Wykorzystaj metodę `removeShadow(Vector3 position, sbyte strength)`, by usunąć cień, który powinien zniknąć, po przesunięciu obiektu.
|
||||
|
||||
## Zadanie 2
|
||||
|
||||
<img src="images/treesinenvironment/inShadow.gif" alt="inShadow" style="zoom:50%;" />
|
||||
|
||||
1. W objekcie inShadow jest skrypt receiveShadow
|
||||
2. Zmodyfikuj skrypt - jak na ten objekt spadnie cień, to zmień materiał na **inShadow**, jak nie będzie w cieniu, to na **noShadow**
|
||||
1. Wykorzystaj funkcję środowiska (Environment)
|
||||
2. public byte shadowStrength(Vector3 pos)
|
||||
1. Do obiektu `inShadow` podpięty jest skrypt `receiveShadow`
|
||||
2. Tak go zmodyfikuj, żeby jak na ten obiekt spadnie cień, to zmień materiał na **inShadow**, a jak nie będzie w cieniu, to na **noShadow**. Wykorzystaj metodę `shadowStrength(Vector3 pos)` obiektu `environment`, żeby odczytać stan zacieniowania.
|
||||
|
||||
## Zadanie 3
|
||||
|
||||
<img src="images/treesinenvironment/treeshadow.png" alt="treeshadow" style="zoom:33%;" /><img src="images/treesinenvironment/treeshadowgreen.png" alt="treeshadowgreen" style="zoom:33%;" /><img src="images/treesinenvironment/treeshadow.png" alt="treeshadow" style="zoom:33%;" />
|
||||
|
||||
1. Wybierz objekt tree (001)
|
||||
1. Wybierz obiekt tree (001)
|
||||
|
||||
2. Jeśli nie jest ustawione, to ustaw odpowiednią ścieżkę (L-System Path) do *ShadowModel.txt*
|
||||
|
||||
@ -92,15 +91,15 @@ bool inVoxelSpace(int a, int b, int c)
|
||||
|
||||
4. Gałęzie w cieniu nadal się rozwijają. Wylicz zacienienie do L-Systemu
|
||||
|
||||
1. Skrypt **TurtleLSystemEnvironment**, funkcja **lightDirection** (20 linijka), od 38 linijki
|
||||
1. W skrypcie **TurtleLSystemEnvironment** uzupełnij metodę **lightDirection** (20 linijka), od 38 linijki
|
||||
|
||||
2. Zacienienie mierzymy w prostopadłościanie wokół obecnego elementu
|
||||
(2\***lookForLightLength** x **lookForLightLength** x 2\***lookForLightLength**)
|
||||
|
||||
<img src="images/treesinenvironment/treebox.png" alt="treebox" style="zoom:50%;" />
|
||||
|
||||
3. Transformacja z obecną pozycją (**transformation**\***resultTransformation**)
|
||||
funkcja transformacja.**ExtractPosition**() zwraca pozycję dla transformacji
|
||||
3. Zmienna `objectTransformation` zawiera transformację obecnego elementu. Po jej przekształceniu, pozycję można uzyskać funkcją *transformacja*.**ExtractPosition()**
|
||||
|
||||
|
||||
5. Wyślij wartość zacienienia do L-Systemu
|
||||
|
||||
@ -113,22 +112,21 @@ S(a,c) : c>=50 -> S(a+1,0)
|
||||
S(a,c) : c<50 -> G\(90)[-S(0,0)]S(0,0)
|
||||
```
|
||||
|
||||
1. 1. L-System będzie odczytywał jako cień drugą wartość - dla **S(a, c)** to będzie **c**
|
||||
2. **node.literal.values** jest tablicą z wartościami L-Systemu
|
||||
W L-Systemie wartość zacienienia jest opisywana przez drugi parametr, czyli `c` w powyższym kodzie. By zmodyfikować parametr musisz odwołać sie do zmiennej `node`, dokładniej do `node.literal.values`, które jest tablicą zawierającą parametry odczytywanego symbolu.
|
||||
|
||||
## Zadanie 4
|
||||
|
||||
<img src="images/treesinenvironment/manytrees.png" alt="manytrees" style="zoom:50%;" />
|
||||
|
||||
1. Dodaj do objektu Environment więcej drzew (Trees) i zobacz jak drzewa wpływają na siebie nawzajem
|
||||
2. Napisz skrypt, który utworzy 9 drzew (3 wiersze i 3 kolumny) rozmieszczonych co równą odległość, przetestuj różne odległości
|
||||
3. Zobacz jak się w takim układzie rozwijają
|
||||
1. Dodaj do objektu Environment więcej drzew (Trees) i zobacz jak drzewa wpływają na siebie nawzajem.
|
||||
2. Napisz skrypt, który utworzy 9 drzew (po trzy w trzech rzędach) rozmieszczonych w równych odstępach, przetestuj różne odległości.
|
||||
3. Zobacz jak się w takim układzie rozwijają.
|
||||
|
||||
|
||||
|
||||
## Zadanie 5 - domowe
|
||||
|
||||
Zintegruj L-System pipe model z wcześniejszych ćwiczeń z obsługą cienia
|
||||
Zintegruj L-System pipe model z wcześniejszych ćwiczeń z obsługą cienia.
|
||||
|
||||
Napisz L-System, który modeluje wybrany przez ciebie kształt drzewa. Kształt ma być twój indywidualny, ale możesz się wspomóc:
|
||||
|
||||
|
BIN
Unity Project/.DS_Store
vendored
BIN
Unity Project/.DS_Store
vendored
Binary file not shown.
BIN
Unity Project/Assets/.DS_Store
vendored
BIN
Unity Project/Assets/.DS_Store
vendored
Binary file not shown.
BIN
Unity Project/Assets/Scripts/.DS_Store
vendored
Normal file
BIN
Unity Project/Assets/Scripts/.DS_Store
vendored
Normal file
Binary file not shown.
@ -35,6 +35,7 @@ abstract public class TurtleLSystemEnvironment : TurtleLSystem {
|
||||
foreach (GameObject gameObject in GameObject.FindGameObjectsWithTag("ShadowCone")) {
|
||||
DestroyImmediate(gameObject);
|
||||
}
|
||||
Matrix4x4 objectTransformation = (transformation*resultTransformation);
|
||||
int nr_shadow_str = 1;
|
||||
//---------------------miejsce-na-zadanie-3.4--------------------------------------//
|
||||
|
||||
|
@ -156,6 +156,10 @@ public class Environment : MonoBehaviour
|
||||
}
|
||||
|
||||
}
|
||||
public void removeShadow(Vector3 position, sbyte strength) // negative value to remove
|
||||
{
|
||||
addShadow(position, -strength);
|
||||
}
|
||||
public void addShadow(Vector3 position, sbyte strength) // negative value to remove
|
||||
{
|
||||
// 6.2 / 0.1 = 62.0
|
||||
|
Loading…
Reference in New Issue
Block a user