Scegli una sequenza di animazioni per un NPC - usa un albero dei comportamenti?

9

Sto implementando un NPC per girare attorno a uno spazio virtuale, in particolare un gatto. Ho una serie di brevi clip di animazione (3-5 secondi). Il mio primo istinto era solo quello di scegliere un'animazione casuale al termine dell'ultima, ma mi sono reso conto che non sarebbe sembrato realistico poiché avrebbe cambiato il comportamento troppo spesso, anche se la successiva animazione è limitata a possibilità fisicamente contingenti.

La mia soluzione prevista è qualcosa di simile ad un albero dei comportamenti ( link ), dove ciascuno l'animazione ha una lista ponderata delle prossime animazioni. Cioè se il gatto cammina, ha l'80% di possibilità di continuare a camminare, il 20% di sedersi, lo 0% di dormire. In pratica, si utilizza un modello markov per ottenere il passaggio successivo appropriato.

Tuttavia non ho idea se questa sia una buona soluzione, né so come sto andando a generare la mappatura dall'animazione corrente alla potenziale successiva animazione + probabilità. 30 animazioni * 30 animazioni successive = 900 ponderazioni. Questo è molto da calcolare manualmente.

A volte il gatto reagisce se colpisce un ostacolo, ma il peso del problema è scegliere una sequenza realistica di animazioni senza prenderle tutte in anticipo. Nell'albero ci sarebbero anche altri input, come la vicinanza a una persona, la posizione nella stanza, il tempo trascorso dall'ultima volta ecc.

    
posta starfish 26.05.2016 - 15:13
fonte

4 risposte

3

In genere devi dividere la logica dei gatti dalle sue animazioni.

Ora prima devi scrivere la logica dei gatti. Un buon approccio che ho trovato è quello di dividere la logica in livelli.

Bisogni

Cat può avere uno stato con alcuni motivi / bisogni (mangiare, dormire, ecc.) che crescono lentamente nel tempo e riducono quando li fanno (pensa Sim). Puoi scegliere un'attività corrente che soddisfi le maggiori esigenze utilizzando la logica fuzzy, se lo desideri.

Attività

Ora in ogni momento il gatto ha un compito (trovare cibo, trovare un letto per dormire, spazio per correre, ecc. essere inattivo è anche un compito). Questi compiti indicano al gatto dove vuoi andare e cosa vuoi fare.

Azioni

Ora c'è il terzo livello: azioni. Ogni obiettivo ha una serie di azioni da fare (alzarsi in piedi, camminare, rannicchiarsi, mangiare, ecc.). Ogni azione è responsabile della sua esecuzione. Per esempio. l'azione di camminata dovrebbe controllare gli ostacoli e consegnare il gatto dal punto A al punto B, possibilmente contenendo ed eseguendo sotto-azioni (salta sopra ostacoli, accucciati sotto i mobili ed ecc.).

Animazioni

Ora, quando il gatto ha bisogno, un'attività e un'azione, puoi scegliere l'animazione giusta per quell'azione. Conoscendo l'animazione corrente e quella successiva dovresti essere in grado di passare dall'uno all'altro. Per esempio. se il compito dice che il gatto dovrebbe sdraiarsi dopo aver camminato verso il suo cuscino, le animazioni sono in coda - walk-stop-sit-lay.

L'accodamento delle animazioni potrebbe essere fatto in modo efficace se le si mappa in un grafico come nodi e si connettono i nodi tra animazioni transitorie (ad esempio è possibile camminare per sedersi, ma saltare a masticare, non a). Quindi puoi accodare le animazioni da ognuna a un'altra usando A * su questo grafico.

Esempio: Il gatto ha bisogno di riposare e di mangiare. Lascia che il compito "Riposo" trovi un posto dove riposare, cammina con il gatto, posalo e riposa. Lascia che il compito di "Riposo" verifichi le condizioni ogni tanto, se i dintorni diventano scomodi, lascia che l'attività finisca. Controlla cosa vuole di più adesso, se vuole ancora riposare - ripeti la parte precedente. Quando il gatto è a riposo, scegli una nuova attività.

    
risposta data 06.06.2016 - 07:57
fonte
2

Penso che quello che stai cercando sia la macchina a stati finiti o FSM. In breve, è un modo per cambiare il comportamento di NPC: s in base al loro stato attuale.

Modifica

È come un albero dei comportamenti ma condensato in alcuni gruppi "stati" a cui l'NPC torna. Un albero comportamentale consente molta più flessibilità del comportamento, ma richiede anche più dati per la ponderazione delle probabilità (un modo intelligente per automatizzarlo è con i tag, come suggerisce scriptin nella sua risposta). Quando si usa afferma si decide un certo insieme di azioni e probabilità per quelle azioni nello stato. Per cambiare in modo formale l'azione corrente può essere distorta con forse l'80% per mantenere la stessa azione, se l'azione deve essere cambiata, le diverse probabilità vengono utilizzate per selezionare la nuova azione.

Nel tuo caso gli stati potrebbero essere (un po 'semplificati):

  • Sleepy: Sleep 80%, Sit 15%, Walk 5%
  • Angry: Roar (i gatti ruggiscono?) 40%, Hiss 40%, Run 20%
  • Affamato: mangia il 40%, caccia il 40%, corri il 10%
  • Giocosi: gioca il 60%, corri il 20%, salta il 10%
  • Scarred: Nascondi 50%, Esegui 50%

Ogni stato può avere diverse probabilità di cambiare stato, ad esempio lo stato arrabbiato o sfregiato forse non dura a lungo. I diversi stati possono anche avere regole diverse per ciò che è legale (il passaggio da "assonnato" a "giocoso" può essere illegale, ma i gatti sembrano non preoccuparsene). Diversi eventi possono far sì che lo stato cambi.

Avere un aspetto in giro cercando sul Web per FSM e AI e puoi vedere come funziona. Può sembrare complicato quando lo spiega, ma è davvero semplice.

    
risposta data 05.06.2016 - 11:31
fonte
1

Puoi utilizzare la codifica:

  • Potrebbero esserci tag di movimento come "posa", "seduto", "in piedi", "camminando" e "correndo". Quindi, puoi eliminare combinazioni non realistiche di tag, ad es. "posa" - > "in esecuzione" (ci deve essere "in piedi" in mezzo).

  • Altri tag possono descrivere attività: "dormire", "mangiare", "cacciare", ecc. Ancora "dormire" - > "caccia" è impossibile senza stati intermedi.

  • Poiché le animazioni come "in piedi" sono transitorie, può essere una buona idea avere tag separati per un inizio e una fine di ogni animazione. Ad esempio, "stare in piedi" può essere una transizione da "seduto" a "stare", ecc.

Quindi, per ogni animazione potresti avere pochi tag:

  • Quelli che descrivono posizione / movimento iniziale e finale
  • Almeno uno che descrive un'attività. Inoltre, poiché le attività hanno anche transizioni, potresti anche avere tag iniziali e finali qui

Con questi, puoi filtrare solo le possibili combinazioni impostando restrizioni come " A->B è possibile solo se final_movement_tag(A) == initial_movement_tag(B) ", che si tradurrà in un numero molto più piccolo. Con quelle possibili combinazioni, puoi fare quello che hai descritto - aggiungere probabilità. L'aggiunta di probabilità può essere basata su tag di attività, poiché rimanere in una stessa attività è più probabile che cambiare attività.

Quindi, con i tag è possibile automatizzare la creazione di tutte le transizioni nell'albero di comportamento / FSM e sintonizzarle successivamente se non si è soddisfatti di alcune combinazioni.

    
risposta data 05.06.2016 - 13:09
fonte
1

Se ti piace mantenere le ricche possibilità degli alberi di comportamento, puoi aggiungere un nuovo tipo di nodo di selezione composito: il nodo selettore Markov.

Dovresti implementare il nodo selettore Markov da solo. Seleziona casualmente uno dei suoi nodi figli, a seconda del nodo (figlio) che in precedenza era riuscito (o non funzionava).

    
risposta data 05.06.2016 - 17:52
fonte

Leggi altre domande sui tag