<divid='write'class=''><h1><aname="ćwiczenia-1403"class="md-header-anchor"></a><span>Ćwiczenia 14.03</span></h1><h2><aname="hello-world-w-unity"class="md-header-anchor"></a><span>Hello World w Unity</span></h2><p><span>(Pliki </span><ahref='https://git.wmi.amu.edu.pl/andkok/Unity_artifitial_world/src/branch/cw1/materiałyHelloWorld'><span>https://git.wmi.amu.edu.pl/andkok/Unity_artifitial_world/src/branch/cw1/materiałyHelloWorld</span></a><span> )</span></p><olstart=''><li><h3><aname="utwórz-nowy-projekt"class="md-header-anchor"></a><span>Utwórz nowy projekt</span></h3><ul><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>Otwórz Unity Hub</span></p></li><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>Wybierz NEW</span></p></li><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>3D, wpisz nazwę i wybierz lokalizacje na twoim komputerze. Zatwierdź klikając CREATE</span></p></li></ul></li><li><h3><aname="import-materiałów-tworzenie-terenu-i-prostych-krztałtów"class="md-header-anchor"></a><span>Import materiałów, tworzenie terenu i prostych krztałtów</span></h3><p><imgsrc="Unityscreen.png"style="zoom:50%;"/></p><p><span>Po środku ekranu jest podgląd sceny (karta Scene). Żeby się w nim przemieszczać klikamy Q i wtedy możemy przesuwać obraz myszką (kliknięcie na prawy przycisk myszy do obracania widoku). Klawisz W zmienia w tryb przesuwania obiektów, a klawisz E jest do obracania obiektów i R zmiany rozmiarów.</span></p><p><span>W dolnej części ekranu, w karcie Project przechowujemy wszystkie modele, tekstury, skrypty i inne potrzebne elementy</span></p><ul><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>W folderze Assets kliknij prawym przyciskiem myszy i z menu wybierz Create -> Folder. Nazwij folder tekstury</span></p></li><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>Otwórz ten folder i przeciągnij do niego wcześniej pobrane tekstury</span></p><p><span>Po lewej stronie jest karta Hierarchy. W niej znajdują się wszystkie obiekty, które są w tworzonej scenie. Tam się dodaje nowe elementy sceny i ustawia zależności pomiędzy elementami</span></p><h4><aname="teren"class="md-header-anchor"></a><span>Teren</span></h4></li><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>Kliknij prawym przyciskiem myszy w polu Hierarchy i wybierz 3D Object -> Terrain</span></p><p><span>Po prawej stronie mamy karte inspector w której są ustawienia zaznaczonego obiektu </span></p><p><imgsrc="ph00009.png"style="zoom:33%;"/></p></li><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>Dodaj teksturę terenu</span></p><ul><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>W Inspektorze przy zakładce Terrain wybierz drugą opcje (ikonka pędzelka)</span></p></li><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>Wybierz z menu Paint Texture</span></p></li><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>Kliknij Edit Terrain Layers -> Create Layer</span></p></li><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>Dodaj trzy tekstury</span></p></li><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>Urozmaić teren zaznaczając tekstury i malując przy pomocy wybranych poniżej pędzli </span></p></li></ul></li><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>Zmień wysokości terenu</span></p><ul><liclass='md-task-list-item task-list-item task-list-not-done'><inputtype='checkbox'/><p><span>W Inspektorze przy zakładce Terrain wybierz drugą opcje
<strong><span>L-System</span></strong><span> to system przepisywania i gramatyka formalna. Składa się z: symboli, które tworzą ciągi znaków; reguł produkcyjnych, które opisują na co należy przepisać dany znak; aksjomatu, czyli początkowego ciągu znaków; i mechanizmu, który tłumaczy ciąg znaków na reprezentacje geometryczną </span></p></blockquote><p><span>Bazą dla tych zajęć jest książka Algorithmic Beauty of Plants dostępna za darmo pod </span><ahref='http://algorithmicbotany.org/papers/abop/abop.lowquality.pdf'><span>linkiem</span></a><span> lub </span><ahref='http://algorithmicbotany.org/papers/abop/abop.pdf'><span>w wyższej jakości</span></a></p><h2><aname="składnia-l-systemów"class="md-header-anchor"></a><span>Składnia L-Systemów</span></h2><p><span>Projekt zawiera bibliotekę, która interpretuje L-Systemy. Ich definicję pobiera z oddzielnego pliku. Ich składnie opisuję definicja L-Systemu opisującego rozwój bakterii Anabaena znajduje się w projekcie pod ścieżką </span><code>Assets\LSystem\Anabaena.txt</code><span> i wygląda następująco:</span></p><prespellcheck="false"class="md-fences md-end-block ty-contain-cm modeLoaded"lang=""><divclass="CodeMirror cm-s-inner CodeMirror-wrap"lang=""><divstyle="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;"><textareaautocorrect="off"autocapitalize="off"spellcheck="false"tabindex="0"style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><divclass="CodeMirror-scrollbar-filler"cm-not-content="true"></div><divclass="CodeMirror-gutter-filler"cm-not-content="true"></div><divclass="CodeMirror-scroll"tabindex="-1"><divclass="CodeMirror-sizer"style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><divstyle="position: relative; top: 0px;"><divclass="CodeMirror-lines"role="presentation"><divrole="presentation"style="position: relative; outline: none;"><divclass="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><divclass="CodeMirror-measure"></div><divstyle="position: relative; z-index: 1;"></div><divclass="CodeMirror-code"role="presentation"style=""><divclass="CodeMirror-activeline"style="position: relative;"><divclass="CodeMirror-activeline-background CodeMirror-linebackground"></div><divclass="CodeMirror-gutter-background CodeMirror-activeline-gutter"style="left: 0px; width: 0px;"></div><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;">#axiom</span></pre></div><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;">L</span></pre><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;">#rules</span></pre><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;">L->lR</span></pre><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;">R->Lr</span></pre><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;">l->L</span></pre><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;">r->R</span></pre><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;">#end rules</span></pre></div></div></div></div></div><divstyle="position: absolute; height: 0px; width: 1px; border-bottom-width: 0px; border-bottom-style: solid; border-bottom-color: transparent; top: 208px;"></div><divclass="CodeMirror-gutters"style="display: none; height: 208px;"></div></div></div></pre><p><span>Plik należy zacząć od linii </span><code>#axiom</code><span>, następnie w następnej linii zamieścić ciąg początkowy. Później pomiędzy liniami </span><code>#rules</code><span> i </span><code>#end rules</code><span> umieścić instrukcje przepisywania według
<span>każdy znak przed strzałką i po strzałce (z wyjątkiem reguł o których później) jest traktowany jako następny symbol. W przypadku kilku reguł, które dotyczą tego samego symbolu wykona się ta, która jest wyżej w pliku. Między reguły można dodawać komentarze, znakiem komentującym jest </span><code>#</code><span>. Jeżeli znak nie posiada żadnej reguły, która by go opisywała, to nie jest on zmieniany. </span></p><p><span>Odpal scenę </span><strong><span>LSystemFromFile</span></strong><span>, zaznacz </span><strong><span>LSystemController</span></strong><span> w panelu po prawej. Po lewej w polu </span><strong><span>L System Path</span></strong><span> wpisz </span><code>Assets\LSystem\Anabaena.txt</code><span> kliknij </span><strong><span>Load File</span></strong><span>, by załadować LSystem. Następnie Evaluate, by wykonać przepisanie. W scenie wyświetlą się obiekty reprezentujące symbole a w konsoli wyświetli się wynik przepisania.</span></p><p><span>Składnia wszystkich rozszerzeń jest zaprezentowana w pliku </span><code>SampleLSystem.txt</code><span> w tej chwili niektóre reguły mogą byc niezrozumiałe, ale może się on przydać później jako wzorzec. </span></p><h2><aname="turtle-graphics"class="md-header-anchor"></a><span>Turtle Graphics</span></h2><p><span>Turtle Graphics jest metodą tworzenia grafiki komputerowej, wykorzystuje kursor (tytułowego żółwia) wykonujący instrukcje w przestrzeni lokalnej.</span></p><p><imgsrc="Turtle-animation-20210313143359379.gif"referrerpolicy="no-referrer"alt="https://en.wikipedia.org/wiki/Turtle_graphics"></p><p><span>L-Systemy można interpretować za pomocą Turtle Graphics, poprzez przypisanie każdemu symbolowi instrukcji jaką ma wykonać żółw. Następnie żółw będzie wykonywał kolejne instrukcje czytając napis od lewej do prawej.</span></p><p><span>Na początek zaczniemy od prostej reprezentacji, gdzie </span><code>+</code><span> będzie oznaczał w kierunku zgodnym z ruchem wskazówek zegara o wskazany kąt, natomiast </span><code>-</code><span> w przeciwnym. Kąt zwyczajowo oznacza się grecką literą $\delta$. Każdy inny symbol będzie oznaczał idź prosto o 1. </span></p><p><span>Odpal Scenę LSystem2D, załaduj plik </span><code>Sierpinski.txt</code><span>, ustaw kąt na 60 stopni i wykonaj kilka kroków. </span></p><h3><aname="zadanie"class="md-header-anchor"></a><span>Zadanie </span></h3><p><span>napisz Lsystem, który będzie rysował gwiazdkę kocha </span></p><ol><li><h4><aname="krzywa-kocha"class="md-header-anchor"></a><span>Krzywa kocha:</span></h4></li></ol><p><imgsrc="../../../../Downloads/Wirtualne Światy treść zadań/Kochsim.gif"/></p><p><imgsrc="../../../../Downloads/Wirtualne Światy treść zadań/RPReplay_Final1615641331.gif"style="zoom:50%;"/></p><p><span>Opis:</span></p><ol><li><span>Podziel linię na 3 równę części</span></li><li><span>Przy środkowej części narysuj równoboczny trójkąt zwrócony na zewnątrz</span></li><li><span>Usuń środkową część pierwotnej lini</span></li></ol><p><span>Musimy z jednej lini zrobić 4 nowe, z czego pierwsza i ostatnia idą w tym samym kierunku, a dwie środkowe idą pod innym kątem (podpowiedź: dając dwa razy + lub - możesz zwiększyć kąt)</span></p><olstart='2'><li><h4><aname="w-pierwszym-kroku-l-systemu-utwórz-trójkąt"class="md-header-anchor"></a><span>W pierwszym kroku L-Systemu utwórz trójkąt</span></h4><p><imgsrc="Von_Koch_curve.gif"referrerpolicy="no-referrer"></p></li></ol><h2><aname="bracketed-l-systems"class="md-header-anchor"></a><span>Bracketed L-systems </span></h2><p><span>W podstawowej wersji L-Systemy są pojedyńczym ciągiem znaków, by uzyskać możliwość tworzenia rozgałęzień wprowadzamy dwa specjalne znaki </span><code>[</code><span> oraz </span><code>]</code><span> pierwszy mówi, żeby zapamiętać obecny stan, drugi oznacza by wrócić do stanu zapamiętanym przy ostatnim znaku </span><code>[</code><span>. Przykładowo ciąg symboli </span><code>F[+FFF][-F]FF</code><span>
<imgsrc="im_bracketed-5642437.jpg"referrerpolicy="no-referrer"alt="obraz"></p><h3><aname="zadanie-n245"class="md-header-anchor"></a><span>Zadanie</span></h3><p><span>Stwórz systemy a i e:</span></p><p><imgsrc="../../../../Downloads/Wirtualne Światy treść zadań/Screenshot 2021-03-13 at 14.29.06.png"alt="Screenshot 2021-03-13 at 14.29.06"/><span></span><imgsrc="Screenshot 2021-03-13 at 14.29.10.png"referrerpolicy="no-referrer"alt="Screenshot 2021-03-13 at 14.29.10"></p><h2><aname="pisanie-własnej-interpretacji-lsystemów"class="md-header-anchor"></a><span>Pisanie własnej interpretacji LSystemów</span></h2><p><span>Wróćmy do sceny LSystemFromFile W tej scenie zamiast kresek pojawiają się figury reprezentujące komórki (czerwona lewa, zielona prawa, niska młoda, wysoka dorosła). Otwórz skrypt AnabeanaTurtle.cs, który odpowiada za rysowanie. Zawiera on klasę </span><code>AnabeanaTurtle</code><span> dziedziczącą po </span><code>TurtleLSystem</code><span>. </span><code>TurtleLSystem</code><span> jest klasą abstrakcyjną, wymaga zdefiniowania funkcji </span><code>initLiteralInterpretation</code><span>, w której należy opisać jak interpretować symbole.</span></p><prespellcheck="false"class="md-fences md-end-block ty-contain-cm modeLoaded"lang="CS"><divclass="CodeMirror cm-s-inner CodeMirror-wrap"lang="cs"><divstyle="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;"><textareaautocorrect="off"autocapitalize="off"spellcheck="false"tabindex="0"style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><divclass="CodeMirror-scrollbar-filler"cm-not-content="true"></div><divclass="CodeMirror-gutter-filler"cm-not-content="true"></div><divclass="CodeMirror-scroll"tabindex="-1"><divclass="CodeMirror-sizer"style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><divstyle="position: relative; top: 0px;"><divclass="CodeMirror-lines"role="presentation"><divrole="presentation"style="position: relative; outline: none;"><divclass="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><divclass="CodeMirror-measure"></div><divstyle="position: relative; z-index: 1;"></div><divclass="CodeMirror-code"role="presentation"style=""><divclass="CodeMirror-activeline"style="position: relative;"><divclass="CodeMirror-activeline-background CodeMirror-linebackground"></div><divclass="CodeMirror-gutter-background CodeMirror-activeline-gutter"style="left: 0px; width: 0px;"></div><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;"> <spanclass="cm-keyword">protected</span><spanclass="cm-keyword">override</span><spanclass="cm-keyword">void</span><spanclass="cm-variable">initLiteralInterpretation</span>() {</span></pre></div><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;"> <spanclass="cm-variable">turtleInterpretation</span><spanclass="cm-operator">=</span><spanclass="cm-keyword">new</span><spanclass="cm-variable">Dictionary</span><spanclass="cm-operator"><</span><spanclass="cm-variable-3">string</span>, <spanclass="cm-variable-3">Func</span><spanclass="cm-operator"><</span><spanclass="cm-variable-3">float</span>[], <spanclass="cm-variable">Tuple</span><spanclass="cm-operator"><</span><spanclass="cm-variable">GameObject</span>, <spanclass="cm-variable">Matrix4x4</span><spanclass="cm-operator">>>></span>();</span></pre><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;"> <spanclass="cm-comment">//turtleInterpretation</span></span></pre><preclass=" CodeMirror-line "role="presentation"><spanrole="presentation"style="padding-right: 0.1px;"> <spanclass="cm-keyword">var</span><spanclass="cm-def">transformation</span><spanclass="cm-ope