Poruszanie się A.I.

Zaglądnij tutaj, jeśli masz pytania lub uwagi dotyczące różnorodnych aspektów tworzenia misji w edytorze Darkmod, jak też związanego z nimi oprogramowania i sprzętu.

Moderatorzy: peter_spy, timon

Awatar użytkownika
Dziarsky
Garrett
Posty: 4861
Rejestracja: 02 listopada 2003, 12:26
Lokalizacja: Gliwice
Kontakt:

Poruszanie się A.I.

Post autor: Dziarsky »

Chciałbym rozkręcić ten wątek by zrobić z tego później tutorial to punktu 7.

Najpierw wyłożę co wiem:

Używamy bytów path_corner, path_wait i path_turn.
W każdym z bytów możemy umieścić właściwość target i dodać w niej nazwę kolejnego bytu, po którym ma się przemieszczać ai.
Dodajemy na mapę model postaci, który też musi mieć właściwość target i zaczyna przechadzkę od bytu, który się znajdzie w tym target.

Jeśli czegoś nie namieszałem to przejdę do omawiania bytów.
Byt path_corner oznacza kiedy idąca postać skręci, path_wait - będzie czekać określony czas (dodana właściwość wait) a path_turn określa kierunek w jakim obrócona jest postać (tu nie wiem czy wystarczy ustawić strzałkę przy bycie czy dodać opcję).

I tu się zaczynają się u mnie schody bo nie potrafię zrozumieć jak dobrze łączyć te byty.

Przypadek najprostszy - chodzenie w kółko:
model(target: path_corner_1) > corner_1(targer: path_corner_2) > corner_2 (path_corner_1) - takie ustawienie spowoduje, że postać będzie chodzić w kółko od jednego punktu do drugiego i z powrotem. Zawsze łączymy byty szeregowo w takim przypadku.

Przypadek gdy postać ma przy drugim punkcie się zatrzymać:
Pytanie: czy path_wait zastępuje path_corner czy uzupełnia. Czyli wystarczy zastąpić np. corner_2 bytem wait_2 i odpowiednio zrobić targety by w punkcie drugim postać sięzatrzymała na określony czas w wait_2 ? Czy to ma być dodatkowy byt, którego target to będzie corner, w którym ma postać się zatrzymać ?

Przypadek z path_turn:
Zauważyłem, że ten byt jest ustawiany jako zewnętrzny, podpięty targetem do path_wait więc tutaj panuje zasada, że on ma tylko "doinformować" model w danym path_wait, w którą stronę ma się obrócić?

Jeszcze odnośnie path_turn.
Czy ten byt można używać częściej w czasie poruszania się postaci po ścieżce czy można go podpinać tylko gdy postać stoi ?

Pytanie odnośnie łączenia:
Czy istnieje sposób by bez wpisywania parametrów ale np. poprzez zaznaczanie i używanie jakiejś opcji edytora odpowiednio nazywać targety?
Obrazek
Awatar użytkownika
Juliusz
Złodziej
Posty: 2774
Rejestracja: 04 stycznia 2004, 11:28
Lokalizacja: Dublin
Kontakt:

Re: Poruszanie się A.I.

Post autor: Juliusz »

Hmm.. nie eksperymentowałem jeszcze ze ścieżkami AI, więc nie jestem w stanie odpowiedzieć Tobie na te pytania. Ale wkrótce też pewnie będę kładł ścieżki w mojej mapie, to sprawdzę te kwestie. No, chyba, że sam je wcześniej rozwikłasz :)

A przy okazji - tak się zastanawiam jak ze słownictwem w naszych tutorialach po polsku. Z jednej strony używasz "byt", z drugiej "target". Trzeba się zastanowić, czy tłumaczyć je i jak tak, to czy wszystkie, czy wybiórczo. Ja byłbym za konsekwencją - albo wszystkie albo nic.
Awatar użytkownika
Dziarsky
Garrett
Posty: 4861
Rejestracja: 02 listopada 2003, 12:26
Lokalizacja: Gliwice
Kontakt:

Re: Poruszanie się A.I.

Post autor: Dziarsky »

Byt oznacza u mnie entity/obiekt (tak mnie nauczyło środowisko Hammera) a target to funkcja bytu taka jak choćby bind.
Ale fakt, trzeba by ustalić jakiś słowniczek.

[ Dodano: Nie 25 Lis, 2007 23:15 ]
Wstępnie rozpracowałem wspólne działanie tych trzech wymienionych przeze mnie wcześniej obiektów. Strzelam niżej przykład tutoriala.
Nazewnictwo: zostańmy przy nazewnictwie entity=obiekt, property=właściwość).

Na wstępie

W poniższym tutorialu używać będziemy następujących obiektów:
path_corner - zakręt/punkt przejścia - postać będzie przechodzić od takiego punktu do następnego skręcając w tym miejscu.
path_wait - miejsce i czas postoju/informacja - dzięki temu obiektowi postać zatrzyma się na określony czas.
path_turn - kierunek ustawienia postaci/informacja - dzięki temu obiektowi podczas postoju postać spoglądać będzie w określonym kierunku.
Użyjemy także modelu postaci, która będzie przemieszczać się po mapie.

Aby dodać wspomniane obiekty musimy kliknąć na widoku siatki prawym klawiszem myszy i wybrać Create entity, następnie rozwinąć pozycję darkmod, następnie rozwinąć Paths i wybrać jeden z przedstawionych obiektów. Następnie klikamy na "Dodaj" by dodać obiekt na mapę.
Aby dodać model postaci podobnie zaczynamy od Create entity, następnie pozycja darkmod -> A.I. i tu wybieramy model postaci.

Gdy dodamy obiekt na mapę i zaznaczymy go w oknie ustawień (inaczej nasz Inspector, Browser). W zakładce Entity mamy listę właściwości. Klikając prawym klawiszem myszy w pustym miejscu możemy wybrać właściwość (Add property...), która będzie nam potrzebna.
W naszym tutorialu będzie to właściwość target oraz dla path_turn angle (ta właściwość doda się też sama gdy zaznaczonym path_turn obrócimy przy pomocy np. z-axis rotate).

Wskazówki:
Postać wstawiona na mapę zachowuje się zgodnie ze swoim przeznaczeniem automatycznie, więc gdy nas zauważy przerywa chodzenie po ścieżce i albo zamiera (neutralna postać) albo zaczyna nas atakować (np. strażnik). Należy więc podczas sprawdzania swoich dokonań ustawić się domyślnie w zaciemnionym miejscu z widokiem na scenę.
W tutorialu użyłem następującego schematu opisującego połączenie obiektów:
nazwa_obiektu (właściwość: parametr; właściwość: parametr).
Obiekty w DR posiadają ogólną nazwę (classname) np. path_corner oraz precyzyjną nazwę (name) z wyszczególnieniem numeru np. path_corner_1. Numeracja jest potrzebna przy większej ilości tych samych obiektów. Właściwość tą (name) jak każdą inną możemy zmieniać i warto numerować kolejne obiekty zgodnie z kierunkiem marszu postaci. Nie zawsze dzieje się to automatycznie gdyż czasem któryś obiekt usuniemy i wstawimy w jego miejsce nowy - edytor automatycznie ustawi kolejny, ostatni numer w nazwie.
Istnieje prosta metoda na "łączenie" obiektów właściwością target. Zaznaczamy obiekty w kolejności od pierwszego do następnego (w naszej ścieżce) i z górnego menu wybieramy Entity -> Connect selected entites. Stworzy nam to w pierwszym zaznaczonym obiekcie właściwość target z nazwą drugiego zaznaczonego obiektu. Co może Was zaskoczyć to fakt, że stosując ta opcję edytor doda w zasadzie właściwość target0 zamiast target. Na tym etapie wiedzy jest to mało istotne i nazwę tą można stosować zamiennie czyli albo wszędzie będzie target albo target0. Uwaga! - zdarza się, że edytor potrafi przekręcić nazwy dodawane do właściwości target więc polecał bym zawsze i tak sprawdzić czy wszystko się zgadza.




Przykład najprostszy - droga w jednym kierunku lub pętla

Aby postać maszerowała od punktu do punktu bez zatrzymywania wystarczy porozkładać w miejscach skrętu czy zawracania obiekty path_corner i w ich właściwościach ustawiać właściwość target na nazwę następnego obiektu path_corner. Przy ostatnim obiekcie ustawiamy target na pierwszy path_corner by postać wróciła na początek i nieprzerwanie chodziła w kółko.

Wyglądać to będzie mniej więcej tak :

path_corner_1 (target: path_corner_2)
path_corner_2 (target: path_corner_3)
path_corner_3 (target: path_corner_1)

Model postaci podpinamy pod dowolny obiekt path_corner ustawiając we właściwościach postaci target: path_corner_x (gdzie x to dowolny numer z obecnych path_corner)

Uwagi:
Model postaci możemy umieścić w dowolnym miejscu na mapie (oczywiście przy podłodze by pojawiając się nie spadała). Przy uruchomieniu mapy postać najpierw dojdzie do path_corner, który ma ustawiony i wtedy zacznie spacerować wg ustalonego schematu.
Można skorzystać z tego zjawiska lub ustawić model postaci jak najbliżej początkowego path_corner by postać niezauważalnie ruszyła "po sznurku".

Jeśli w ostatnim path_corner nie ustawimy właściwości target to postać zatrzyma się tam na stałe.




Przykład z postojem postaci

Aby postać w danym path_corner zatrzymała się na określony czas należy w następnej kolejności ustawić obiekt path_wait z właściwością wait: x (gdzie x to czas postoju w sekundach).
Następnie z obiektu path_wait ustawić właściwość target do następnego path_corner po drodze.
Najprościej mówiąc należy obiekt path_wait wstawić pomiędzy dwa path_corner aby ustawiony czas działał na rzecz path_corner, tym przed path_wait.

Wyglądać to będzie mniej więcej tak (postój w punkcie 2):

path_corner_1 (target: path_corner_2)
path_corner_2 (target: path_wait_1)
path_wait_1 (target: path_corner_3; wait: 5)
path_corner_3 (target: path_corner_1)

Oczywiście do któregoś path_corner podpinamy model postaci (patrz przykład wyżej).

Uwagi:
Path_wait nie stanowi sam w sobie punktu, przez który postać będzie iść ale jedynie informację o tym gdzie postać ma stanąć. Warto wiec obiekt ten ustawiać ciut za path_corner by wiadomo było, do którego obiektu się on odnosi. łatwiej będzie jedynie zerkając na nasz ciąg obiektów ustalić w którą stronę on zmierza.




Przykład z postojem postaci zwróconej w określoną stronę

Nie raz będziemy chcieli by postać zatrzymująca się na mapie spoglądała w określonym kierunku (np. na jakaś maszynę czy przez okno). Posłuży nam do tego obiekt path_turn, który podobnie jak path_wait jest jedynie dodatkową informacją "dopinaną" do naszej ścieżki marszu. Podobnie jak w punkcie wcześniejszym obiekt path_turn znaleźć się musi pomiędzy dwoma obiektami path_corner i będzie "działał" na obiekt poprzedzający siebie. Dodatkową właściwością dla path_turn jest angle czyli kąt/kierunek, pod którym postać spoglądać (jest to kąt w poziomie, w widoku z góry widać strzałkę pokazującą ustawiony kierunek). Kierunek najprościej jest ustawić przy pomocy dostępnych narzędzi takich jak rotate czy z-axis rotate ale można oczywiście wartość wpisać ręcznie we właściwości angle.


Wyglądać to będzie mniej więcej tak (postój w punkcie 2 ze spoglądaniem w określony kierunek):

path_corner_1 (target: path_corner_2)
path_corner_2 (target: path_wait_1)
path_wait_1 (target: path_turn_1; wait: 5)
path_turn_1 (target: path_corner_3; angle: 180)
path_corner_3 (target: path_corner_1)

Uwagi:
Podobnie jak w uwagach z obiektem path_wait warto dbać o dobre ułożenie przestrzenne path_turn względem path_corner by szybciej odnaleźć właściwy kierunek poruszania się.

Koniec.



__________

Jeśli ktoś sprawdzi, że działa wg mojego opisu to wstawię to wraz z obrazkami jakimiś jako regularny tutorial.

Jeszcze kilka niewiadomych:
1. Jak wspomniałem gdzieś wyżej, że używając opcji Connect selected entites edytor tworzy właściwość target0 zamiast target co jest w zasadzie tym samym. Wybadałem, że można łączyć path'y wstecz i wtedy dodaje się już jakby kolejna warstwa połączeń z właściwością target1. Może być tych targetów i więcej. Problem w tym, że edytor się gubił gdy tak robiłem i podczas testów postać wyraźnie nie wiedziała gdzie iść i się kręciła od punktu do punktu losowo. Ktoś to obada to będzie dobrze bo to pozwala zmniejszyć ilość path'y o połowę.

2. Nie wiem jak u Was ale u mnie w momencie przejścia przez path_corner w grze postać na chwilkę przystaje i dopiero skręca/idzie dalej. Nie wiem czy to wina animacji modelu czy kwestia ustawień, nie doszedłem do tego a warto by to znieść bo wygląda sztucznie.
Ostatnio zmieniony 18 stycznia 2008, 01:55 przez Dziarsky, łącznie zmieniany 1 raz.
Obrazek
Awatar użytkownika
Juliusz
Złodziej
Posty: 2774
Rejestracja: 04 stycznia 2004, 11:28
Lokalizacja: Dublin
Kontakt:

Re: Poruszanie się A.I.

Post autor: Juliusz »

Dziarsky, wygląda to dobrze. :) Na razie nie mogę sprawdzić. Kurcze, zawsze mnie coś odrywa od tego moda.
ad. 1) nie wiem dokładnie o co chodzi, ale wiem, że jak jest kilka punktów połączonych ze sobą, to postać wybiera zawsze losowo jeden z nich. To jest celowa funkcja losowych patroli. Może szkopuł tkwi w jakimś zapętlającym sposobie ich połączenia albo co?
ODPOWIEDZ