PDA

View Full Version : Pathfinder [c++]


okay
22-08-2005, 22:57
sto sviluppando una applicazione ora mi sto impegnando con l'AI (intelligenza artificiale)

ho delle sfere che seguono il path della spline o linea (editable mesh) l'oggetto è salvato come spline.x

In pratica la mia applicazione simula una strada con la sua carreggiata che in questo caso è delimitata dal bordo interno (carreggiata sinistra da una spline) e carreggiata destra da un'altra spline, Ora devo muovermi con la sfera e devo fare in modo di non oltreppassare i bordi cioè andare fuori strada.

L'oggetto spline (linea fatta con 3ds max) è composta di tot vertici la lunghezza tra un vertice e l'altro costituisce un vettore che ha caratteristiche di posizione, direzione e lunghezza.

la velocità della sfera la ottengo così:
position = pNode[0].Pos + (PathDir[0].Dir * pAI->Vel * pAI->TimeWay);
....... sarebbe posizione della sfera = posizione del nodo + la direzione normalizzata * la velocità * il tempo cioè la velocità di movimento da un punto ad un altro compresa in un secondo.

N.B TimeWay è il tempo appunto.

http://www.twork.it/work/immagine.gif

questo è un disegno che spiega la spline e il suo corso

se il percorso dei vertici è dritto nessun problema la sfera si muove perfettamente ed è allineata.

Chiaramente le sfere le devo muovere
se come nel disegno la spline svolta a destra o sinistra il calcolo si và a fare benedire cioè la sfera non segue bene il path e scatta in avanti per esempio nella curva a destra all'indietro nella curva a sinistra recuperando cmq la sua posizione ma in modo brusco di cambiamento di posizione.

nel disegno e cmq la prova che sto facendo è la seguente:
se guardate il disegno e il codice capite qual'è il problema dello scatto.
Ci sono quasi vicini ma mi manca un passaggio.

IL PROBLEMA DELL'ALGORITMO:

spostando la sfera a +5 dalla spline essa fà tutto il path del vettore da vertice a vertice quando il vettore del prossimo nodo è a destra la sfera finisce la lunghezza del path fino al nuovo nodo mentre invece la sfera dovrebbe concludere prima il path all'altezza del nodo successivo a +5 e girare sul nuovo nodo senza cambi di posizione brusca.

---------------code------------------
pAI->vDiff=PathDir[0].Dir * pAI->Vel * pAI->TimeWay;//Diff tiene conto diTimeWay la direzione del path è la velocità
position+=Posizione(&pObject[0]); //posizione della sfera a +5
pNode[1].Pos=pNodePath[pAI->WayPos+1].Pos;//copio la posizione del nodo successivo in una var temporanea
pNode[1].Pos+=Posizione(&pObject[0]);//sposto il nodo successivo a +5
vLength = pNode[1].Pos - position;//posizione del nodo successivo - posizione della sfera
vLength1 = pNode[0].Pos - position - pAI->vDiff;
q=Path[pAI->WayPos].Length*pAI->Scale;//q = la lunghezza del path del vettore
q1=D3DXVec3Length(&vLength);//assegnamento al float per i calcoli
q+=q1;//q=lunghezza del path + posizione nodo successivo meno posizione della sfera


if(D3DXVec3Length(&vLength) >= q-D3DXVec3Length(&vLength1))//se ha raggiunto o superato la lunghezza del path del vettore cambio nodo
{
----------end code-------------------

spero di essermi spiegato e so anche che non è un argomento semplice

ciao