Introducció
L'evitació d'obstacles és una part fonamental de la navegació en els videojocs. Els personatges no només han de trobar el camí més curt o eficient cap a la seva destinació, sinó que també han de ser capaços d'evitar col·lisions amb objectes estàtics i dinàmics en el seu entorn. Aquest tema cobreix els conceptes bàsics i les tècniques utilitzades per implementar l'evitació d'obstacles en els videojocs.
Conceptes Bàsics
Tipus d'Obstacles
- Estàtics: Obstacles que no es mouen, com parets, edificis, arbres, etc.
- Dinàmics: Obstacles que es mouen, com altres personatges, vehicles, etc.
Estratègies d'Evitació
- Desviació Simple: Canviar lleugerament la trajectòria per evitar un obstacle.
- Replanificació de Camí: Recalcular completament el camí per evitar obstacles.
- Evitació Predictiva: Preveure el moviment dels obstacles dinàmics i ajustar la trajectòria en conseqüència.
Algoritmes d'Evitació d'Obstacles
Algoritme de Desviació Simple
Aquest és un mètode senzill on el personatge ajusta la seva trajectòria en funció de la proximitat a un obstacle.
def desviacio_simple(posicio_actual, direccio, obstacles): for obstacle in obstacles: if distancia(posicio_actual, obstacle) < dist_minima: direccio = ajusta_direccio(direccio, obstacle) return direccio def ajusta_direccio(direccio, obstacle): # Ajusta la direcció per evitar l'obstacle nova_direccio = direccio + vector_aleatori() return normalitza(nova_direccio)
Algoritme de Replanificació de Camí
Aquest mètode implica recalcular el camí utilitzant un algoritme de cerca com A* quan es detecta un obstacle.
def replanificacio_cami(posicio_actual, destinacio, obstacles, graella): if obstacle_detectat(posicio_actual, obstacles): nou_cami = a_estrella(posicio_actual, destinacio, graella) return nou_cami return cami_actual
Algoritme d'Evitació Predictiva
Aquest mètode utilitza la predicció del moviment dels obstacles dinàmics per ajustar la trajectòria del personatge.
def evitacio_predictiva(posicio_actual, velocitat, obstacles_dinamics): for obstacle in obstacles_dinamics: posicio_futura = predir_posicio(obstacle) if colisio_predita(posicio_actual, posicio_futura): velocitat = ajusta_velocitat(velocitat, obstacle) return velocitat def predir_posicio(obstacle): # Prediu la posició futura de l'obstacle return obstacle.posicio + obstacle.velocitat * temps def colisio_predita(posicio_actual, posicio_futura): # Determina si hi haurà una col·lisió return distancia(posicio_actual, posicio_futura) < dist_minima
Exemples Pràctics
Exemple 1: Desviació Simple
Imagina un personatge que es mou cap a una destinació però troba una roca al seu camí. Utilitzant la desviació simple, el personatge ajusta lleugerament la seva trajectòria per evitar la roca.
posicio_actual = [5, 5] direccio = [1, 0] obstacles = [[7, 5]] nova_direccio = desviacio_simple(posicio_actual, direccio, obstacles) print(nova_direccio) # Sortida esperada: [1, 0.1] o similar
Exemple 2: Replanificació de Camí
Un personatge ha de recalcular el seu camí quan troba un obstacle inesperat.
posicio_actual = [5, 5] destinacio = [10, 10] obstacles = [[7, 7]] graella = crea_graella(10, 10, obstacles) nou_cami = replanificacio_cami(posicio_actual, destinacio, obstacles, graella) print(nou_cami) # Sortida esperada: Un nou camí que evita l'obstacle
Exemple 3: Evitació Predictiva
Un personatge prediu el moviment d'un altre personatge i ajusta la seva velocitat per evitar una col·lisió.
posicio_actual = [5, 5] velocitat = [1, 0] obstacles_dinamics = [{'posicio': [7, 5], 'velocitat': [-1, 0]}] nova_velocitat = evitacio_predictiva(posicio_actual, velocitat, obstacles_dinamics) print(nova_velocitat) # Sortida esperada: [1, 0.1] o similar
Exercicis Pràctics
Exercici 1: Implementació de Desviació Simple
Implementa una funció que ajusti la direcció d'un personatge per evitar un obstacle estàtic.
Solució:
def desviacio_simple(posicio_actual, direccio, obstacles): for obstacle in obstacles: if distancia(posicio_actual, obstacle) < dist_minima: direccio = ajusta_direccio(direccio, obstacle) return direccio def ajusta_direccio(direccio, obstacle): # Ajusta la direcció per evitar l'obstacle nova_direccio = direccio + vector_aleatori() return normalitza(nova_direccio)
Exercici 2: Replanificació de Camí
Implementa una funció que recalculi el camí d'un personatge quan es troba amb un obstacle.
Solució:
def replanificacio_cami(posicio_actual, destinacio, obstacles, graella): if obstacle_detectat(posicio_actual, obstacles): nou_cami = a_estrella(posicio_actual, destinacio, graella) return nou_cami return cami_actual
Exercici 3: Evitació Predictiva
Implementa una funció que prediu el moviment d'obstacles dinàmics i ajusta la velocitat del personatge per evitar col·lisions.
Solució:
def evitacio_predictiva(posicio_actual, velocitat, obstacles_dinamics): for obstacle in obstacles_dinamics: posicio_futura = predir_posicio(obstacle) if colisio_predita(posicio_actual, posicio_futura): velocitat = ajusta_velocitat(velocitat, obstacle) return velocitat def predir_posicio(obstacle): # Prediu la posició futura de l'obstacle return obstacle.posicio + obstacle.velocitat * temps def colisio_predita(posicio_actual, posicio_futura): # Determina si hi haurà una col·lisió return distancia(posicio_actual, posicio_futura) < dist_minima
Resum
En aquesta secció, hem explorat diverses tècniques per a l'evitació d'obstacles en videojocs, incloent desviació simple, replanificació de camí i evitació predictiva. Hem vist exemples pràctics i hem proporcionat exercicis per reforçar els conceptes apresos. Amb aquestes tècniques, els personatges del joc poden navegar de manera més intel·ligent i realista, evitant col·lisions amb obstacles estàtics i dinàmics.
IA per a Videojocs
Mòdul 1: Introducció a la IA en Videojocs
Mòdul 2: Navegació en Videojocs
Mòdul 3: Presa de Decisions
Mòdul 4: Aprenentatge Automàtic
- Introducció a l'Aprenentatge Automàtic
- Xarxes Neuronals en Videojocs
- Aprenentatge per Reforç
- Implementació d'un Agent d'Aprenentatge
Mòdul 5: Integració i Optimització
Mòdul 6: Projectes Pràctics
- Projecte 1: Implementació de Navegació Bàsica
- Projecte 2: Creació d'un NPC amb Presa de Decisions
- Projecte 3: Desenvolupament d'un Agent amb Aprenentatge Automàtic