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 # 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
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 ### 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# ```C#
for(int j = (int)voxelPosition.y; j >= 0; j--) for(int j = (int)voxelPosition.y; j >= 0; j--)
@ -27,11 +27,11 @@ for(int j = (int)voxelPosition.y; j >= 0; j--)
### shadowStrength ### shadowStrength
Zwraca siłę cienia w zadanej pozycji Zwraca siłę cienia w zadanej pozycji świata.
### inVoxelSpace ### 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# ```C#
bool inVoxelSpace(int a, int b, int c) bool inVoxelSpace(int a, int b, int c)
@ -42,6 +42,8 @@ bool inVoxelSpace(int a, int b, int c)
### positionInVoxel i positionInWorld ### positionInVoxel i positionInWorld
Konwertuje `positionInVoxel` z pozycji w przestrzeni świata do pozycji w przestrzeni *voxel space* `positionInWorld` odwrotnie.
```C# ```C#
public Vector3 positionInVoxel(Vector3 positionInWorld) 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%;" /> <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" 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. 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ół. 3. Zmodyfikuj skrypt, tak aby ten obiekt rzucał cień w dół:
1. Wykorzystaj funkcję środowiska (Environment) 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.
2. public void addShadow(Vector3 position, sbyte strength) // ujemna siła, aby usunąć (Vector3 position to pozycja shadowBox)
## Zadanie 2 ## Zadanie 2
<img src="images/treesinenvironment/inShadow.gif" alt="inShadow" style="zoom:50%;" /> <img src="images/treesinenvironment/inShadow.gif" alt="inShadow" style="zoom:50%;" />
1. W objekcie inShadow jest skrypt receiveShadow 1. Do obiektu `inShadow` podpięty 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** 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.
1. Wykorzystaj funkcję środowiska (Environment)
2. public byte shadowStrength(Vector3 pos)
## Zadanie 3 ## 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%;" /> <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* 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 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. Zacienienie mierzymy w prostopadłościanie wokół obecnego elementu
(2\***lookForLightLength** x **lookForLightLength** x 2\***lookForLightLength**) (2\***lookForLightLength** x **lookForLightLength** x 2\***lookForLightLength**)
<img src="images/treesinenvironment/treebox.png" alt="treebox" style="zoom:50%;" /> <img src="images/treesinenvironment/treebox.png" alt="treebox" style="zoom:50%;" />
3. Transformacja z obecną pozycją (**transformation**\***resultTransformation**) 3. Zmienna `objectTransformation` zawiera transformację obecnego elementu. Po jej przekształceniu, pozycję można uzyskać funkcją *transformacja*.**ExtractPosition()**
funkcja transformacja.**ExtractPosition**() zwraca pozycję dla transformacji
5. Wyślij wartość zacienienia do L-Systemu 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) 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** 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.
2. **node.literal.values** jest tablicą z wartościami L-Systemu
## Zadanie 4 ## Zadanie 4
<img src="images/treesinenvironment/manytrees.png" alt="manytrees" style="zoom:50%;" /> <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 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 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ą 3. Zobacz jak się w takim układzie rozwijają.
## Zadanie 5 - domowe ## 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: 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")) { foreach (GameObject gameObject in GameObject.FindGameObjectsWithTag("ShadowCone")) {
DestroyImmediate(gameObject); DestroyImmediate(gameObject);
} }
Matrix4x4 objectTransformation = (transformation*resultTransformation);
int nr_shadow_str = 1; int nr_shadow_str = 1;
//---------------------miejsce-na-zadanie-3.4--------------------------------------// //---------------------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 public void addShadow(Vector3 position, sbyte strength) // negative value to remove
{ {
// 6.2 / 0.1 = 62.0 // 6.2 / 0.1 = 62.0