MWS_2021/Opis.md
2021-05-06 01:27:44 +02:00

135 lines
4.9 KiB
Markdown

# Trees in environment
Aby zasymulować środowisko wykorzystamy voxel space. W środowisku będziemy rozpatrywać tylko jedną cechę - zacienienie.
## Klasa Environment
Klasa environment zawiera voxel space z informacją o zacienieniu.
### addShadow
Funkcja addShadow 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.
```C#
for(int j = (int)voxelPosition.y; j >= 0; j--)
{
for(int i = (int)voxelPosition.x-rotj; i <= (int)voxelPosition.x+rotj; i++)
{
for(int k = (int)voxelPosition.z-rotj; k <= (int)voxelPosition.z+rotj; k++)
{
float secondaryStrength = 1.0f*strength;
secondaryStrength = secondaryStrength / ((Mathf.Abs(k-(int)voxelPosition.z) + 1 + Mathf.Abs(i-(int)voxelPosition.x))/8.0f);
(...)
}
}
}
```
### shadowStrength
Zwraca siłę cienia w zadanej pozycji
### inVoxelSpace
Sprawdza, czy dane współrzędne się mieszczą w voxel space
```C#
bool inVoxelSpace(int a, int b, int c)
{
return (a<sizeX&&a>=0&&b<sizeY&&b>=0&&c<sizeZ&&c>=0);
}
```
### positionInVoxel i positionInWorld
```C#
public Vector3 positionInVoxel(Vector3 positionInWorld)
{
Vector3 voxelPosition = new Vector3(0.0f,0.0f,0.0f);
positionInWorld -= gameObject.GetComponent<Transform>().position;
voxelPosition.x = (int)(0.5f + (positionInWorld.x / voxelSize));
voxelPosition.y = (int)(0.5f + (positionInWorld.y / voxelSize));
voxelPosition.z = (int)(0.5f + (positionInWorld.z / voxelSize));
return voxelPosition;
}
public Vector3 positionInWorld(Vector3 positionInVoxel)
{
return positionInVoxel*voxelSize+gameObject.GetComponent<Transform>().position;
}
```
## Zadanie 1
<img src="images/Trees in environment/shadowBox-0244468.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ąć
## Zadanie 2
<img src="images/Trees in environment/inShadow-0245281.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ł
1. Wykorzystaj funkcję środowiska (Environment)
2. public byte shadowStrength(Vector3 pos)
## Zadanie 3
<img src="images/Trees in environment/treeshadow-0250708.png" alt="treeshadow" style="zoom:33%;" /><img src="images/Trees in environment/treeshadowgreen-0250548.png" alt="treeshadowgreen" style="zoom:33%;" /><img src="images/Trees in environment/treeshadow-0250563.png" alt="treeshadow" style="zoom:33%;" />
1. Wybierz objekt tree (001)
2. Jeśli nie jest ustawione, to ustaw odpowiednią ścieżkę (L-System Path) do *ShadowModel.txt*
3. Uruchom grę i przejdź kilka kroków (Load File na start i Evaluate - krok)
4. Gałęzie w cieniu nadal się rozwijają. Wylicz zacienienie do L-Systemu
1. Skrypt **TurtleLSystemEnvironment**, funkcja **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/Trees in environment/treebox.png" alt="treebox" style="zoom:50%;" />
3. Transformacja z obecną pozycją (**transformation**\***resultTransformation**)
funkcja transformacja.**ExtractPosition**() zwraca pozycję dla transformacji
5. Wyślij wartość zacienienia do L-Systemu
```python
#ignore + - \ / ^ &
#axiom
S(0,0)
#rules
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
## Zadanie 4
<img src="images/Trees in environment/manytrees-0251718.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 (3x3) rozmieszczonych co równą odległość
3. Zobacz jak się w takim układzie rozwijają
## Inne sposoby modyfikacji drzewa, przez voxel Space
W Environment są jeszcze funkcje rotate towards light i cut branches with max shadow, które też mogą wykorzystać voxel space do modyfikacji drzewa w inny, nie L-Systemowy sposób (najpierw jest krok L-Systemu, a potem te funkcje modyfikują drzewo).
## Zadanie 5 - domowe
Wybierz zdjęcie dowolnego drzewa (każdy inne) i stwórz L-System podobny do tego drzewa, ale zależny od cienia
Do rozwiązania dodaj zdjęcie drzewa i zdjęcie odtworzonego drzewa. L-System nazwij imięnazwiskoShadow.