cwiczenia 5 trees in environment

This commit is contained in:
duszekjk 2021-05-07 21:13:09 +02:00
parent b85d37858e
commit 216e6fcfa4
6 changed files with 26 additions and 23 deletions

44
Opis.md
View File

@ -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:

Binary file not shown.

Binary file not shown.

BIN
Unity Project/Assets/Scripts/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -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--------------------------------------//

View File

@ -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