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
|
# 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:
|
||||||
|
|
||||||
|
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")) {
|
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--------------------------------------//
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user