Utilizator:
Parola:
Am uitat parola... | Cont nou!


Articole Resurse Echipe Competiții Proiecte Forum DevBlogs Locuri de muncă GDROMag Issue#1 GDROCon 2007

 
Forum » Articole » Programare » Pathfinding NH

Articol:
Pathfinding NH
Autor: night_hawk, postat pe 08 Sep 2007 14:28:39
Versiune printabilã
Da, am rezolvat cu pathfinding-ul in Galactica : Corsairs si vreau sa spun tuturor cum! Nu e o metoda prea eficienta, dar e mai rapida decat majoritatea alternativelor. Adaug la final si cod sursa de exemplu.

BTW: Acest algoritm este doar pentru pathfinding in spatiu, fara terrain.

Incepem.

Se stie pozitia unitatii 1. Se stie unde doreste unitatea 1 sa ajunga. Se traseaza 2 linii de la unitatea 1 la tinta in modul urmator: prima linie isi are originea mai sus de pozitia unitatii 1 cu o valoare predefinita sau generata sau unica pentru unitatea respectiva, in timp ce originea celei de a doua linii e mai jos cu aceasi valoare. Capetele liniilor se pozitioneaza analog cu originea pentru a se interesecta.


Figura 1 - Cam cum sunt pozitionate liniile descrise

Pasul 2 este optional, dar este destul de folositor deoarece ar putea mari viteza algoritmului considerabil, desi va consuma mai multa memorie. Unitatile vor fi aranjate intr-o matrice de A x A, unde A depinde de numarul de unitati, unde fiecare element este un array de id-uri sau pointeri catre unitatile reprezentate. In aceasta matrice unitatile sunt aranjate dupa pozitia lor in spatiu 2D (Doar X si Z), cu posibilitatea ca mai multe unitati sa fie in aceasi pozitie in matrice.

Pasul 3 este chiar metoda propriu zisa: daca s-a facut pasul 2, se fac coliziuni intre linii si bounding-box-ul fiecarei unitati din elementele adiacente elementului unitatii pentru care facem pathfinding-ul, iar daca nu s-a facut pasul 2, cu toate unitatile de pe harta. Daca s-a gasit o coliziune, nu se mai verifica in continuare, iar unitatii pentru care am verificat i se spune sa se ridice / coboare / opreasca, asta depinzand de ce aveti nevoie.

Nu e eficient pe distante scurte, dar este rapid si, zic eu, destul de usor de implementat.

Cod sursă:

irr::core::line3df line,line2;
line.start= units[i].node->getPosition()+vector3df(0,40,0);
line2.start= units[i].node->getPosition()+vector3df(0,-40,0);
vector3df targ=units[i].target;
targ.Y=oldy;
line.end=targ+vector3df(0,-40,0);
line2.end=targ+vector3df(0,40,0);
bool colis=0;
vector3df pos22;
    for(int i2=1;i2(mai mic)=count;i2++)
    {
        colis = smgr->getSceneCollisionManager()->getCollisionPoint(line,     units[i2].node->getTriangleSelector(), colres, coltri);
        if(colis)
        {
            pos22=units[i2].node->getPosition();
            i2=count;
        } else {
            colis = smgr -> getSceneCollisionManager()->getCollisionPoint(line2,units[i2].node->getTriangleSelector(),colres,coltri);
            if(colis)
            {
                pos22=units[i2].node->getPosition();
                i2=count;
            }
        }
    }
if(colis)
{
    // Colission has been found, there is something blocking the way, do whatever you need to do in that case.
}
 

Comentarii pentru acest articol:



Pagina 1 din 1 [ 1 ]

Mesaj Info autor
    Postat la 08 Sep 2007 20:05:18    Subiect: < fara subiect >
roflamerider info:

roflamerider:

gandisem si eu mai demult un sistem de pathfinding. .. pt un rpg 3d ..
adica lucram cam in 3 axe... am perfectionat un pic conceptul... dar nu l'am testat..
cand o sa'l testez poate o sa fac un articol...
e bazat pe un fel de tile-uri

Can I e-mail beer?


Status:
Înregistrat pe:
07 Sep 2007 20:27:20
Vârsta: 21 ani
Mesaje: 39
Locatie: Wherever I may roam
Programator junior

 
    Postat la 08 Sep 2007 21:24:12    Subiect: < fara subiect >
MithY info:

MithY:

Mai toate pathfindingurile sunt bazate pe tileuri si daca vrei unul usor invata algoritmul lui Lee daca vrei un pathfindig in cantitati mari pentru un RTS vezi A*

gamedev for life


Status:
Înregistrat pe:
25 Feb 2007 20:12:02
Vârsta: 21 ani
Mesaje: 435
Locatie: Iasi
Programator
Digital Void Entertainment
 
    Postat la 08 Sep 2007 21:33:15    Subiect: < fara subiect >
night_hawk info:

night_hawk:

Si Dijkstra poate fi implementat destul de nice in jocuri.


Status:
Înregistrat pe:
25 Mar 2007 22:01:13
Vârsta: 20 ani
Mesaje: 506
Locatie: Suceava
Programator junior
Esotheria
 
    Postat la 08 Sep 2007 21:45:04    Subiect: Re:
Rimio info:

Rimio:

night_hawk a scris:

Si Dijkstra poate fi implementat destul de nice in jocuri.


Totul depinde de ce vrei sa faci (A to B sau alte minuni ?). De asemenea, algo astia "perfecti" merg numai pentru scene mici, cu noduri de ordinul zecilor, hai sutelor. Dupaia incep sa schioapete.

If at first you don't succeed, you fail.



Status:
Înregistrat pe:
24 Mar 2007 21:50:44
Vârsta: 23 ani
Mesaje: 794
Locatie: Pitesti, Arges
Programator

 

Pagina 1 din 1 [ 1 ]


Server time: 15:18:03 10.02.2012



[ Termeni si conditii | Contact | F.A.Q. | Funny Pictures ]

© 2011 Copyright 7thFACTOR Entertainment - All rights reserved