PDA

View Full Version : x cionci [vc6] Direct3d


okay
04-06-2004, 17:37
ciao amico mio................. sto lavorando in direct3d e directx:

La domanda principale è:
Nella mappa che ho fatto devo valutare, dalle coordinate di dove mi trovo x e z se il punto, appunto x e z, si trova sul primo triangolo o il secondo.....................

mi spiego meglio:
Innanzitutto ogni quadrato della mappa è formato da 2 triangoli esempio:
0.....5 per la x
------/5
t1/t2|
/-----|0 per la y coordinate in pixel

anche se il disegno è in pò primordiale, si capisce che t1 è il primo triangolo e t2 è il secondo........ ora avendo le coordinate x e z riesco a prendere gli indici, del Indexbuffer che sono così costituiti:
0 1 2 per il primo triangolo t1 e 3 4 5 per t2 il secondo triangolo:
questa è la ma formula per estrarre gli indice dall'index buffer:

s=cz+3;

v1=pVertices[s].position;
v2=pVertices[s+1].position;
v3=pVertices[s+2].position;

cz+3 è perche prendo sempre gli indici + grandi in questo caso 3 4 5......... ora facendo i dovuti calcoli riesco a camminare in quota sul mio terreno................................ okay spiegato questo, passo alla domanda del tread:

se guardi il mio disegno e provi a verificare la coordinata x=2 e z=6 io mi trovo sul primo triangolo il problema è che estraggo gli indici del secondo triangolo quindi dovrei calcolare che le coordinate x=2 e z=6 fanno parte del primo triangolo ed estrarre gli indici 0 1 2 ovvero s=cz-3 e infatti camminerei in quota anche sul primo triangolo

per far questo ho pensato di prendere in considerazione la coordinata x tracciare una linea(lato) che congiunga un vertice di t1 vertice x=0 e y=0 (del primo triangolo e calcolare l'angolo e se l'angolo è >45° allora lascio s=cz+3 se <45° faccio s=cz-3
------------------------------
Allora cionci mi aiuti a sviluppare questo piccolo algoritmo, sono a digiuno di geometria di angoli ecc, ecc...............
------------------------------

questo è il mio algoritmo:

s=cz+3;


v1=pVertices[s].position;
v2=pVertices[s+1].position;
v3=pVertices[s+2].position;

/*
Nota: v1,v2,v3 sono vettori appartenenti alla struct quindi:
ora ho le coordinate del triangolo xyz
v1.x v1.y v1.z.........v2.x v2.y v3.z e v3.x v3.y v3.z.....chiaro?
*/

//Questa sotto per ricavare gli angolo ma tieni presente
// quello detto sopra

float theta, alfa, angle, xnew, ynew, pi=3.14f;
angle = 0;
for(int i=0; i<3;i++){

if(i==0){
theta = atan2(v1.x - x, v1.y - z);
xnew = (v2.x - x) * cos(theta) + (v2.y - z) * sin(theta);
ynew = (v3.y - z) * cos(theta) - (v3.x - x) * sin(theta);
}

if(i==1){
theta = atan2(v2.x - x, v2.y - z);
xnew = (v1.x - x) * cos(theta) + (v1.y - z) * sin(theta);
ynew = (v3.y - z) * cos(theta) - (v3.x - x) * sin(theta);
}

if(i==2){
theta = atan2(v3.x - x, v3.y - z);
xnew = (v1.x - x) * cos(theta) + (v1.y - z) * sin(theta);
ynew = (v2.y - z) * cos(theta) - (v2.x - x) * sin(theta);
}

alfa = atan2(ynew, xnew);

angle = angle + alfa;

}

if(fabs(angle)>pi){
s=cz;//estraggo gli indici 0 1 2
v1=pVertices[s].position;
v2=pVertices[s+1].position;
v3=pVertices[s+2].position;
}

....................................

//NON SONO SICURO DI QUESTA ROUTINE SOTTO
//PUOI CONTROLLARE................. gli if ed else if e naturalmente
// i valor passti e ritornati......

float CGame::atan2(float Y, float X)
{

float valore;
float pi,hpi;

pi=3.14f;

hpi=hpi/2;
if(X==0){
if(Y>0)
valore=hpi;

else if (Y<0)
valore=-hpi;

else

valore=0;
}
else if(Y==0){
if(X<0){
valore = pi;
} else{
valore = 0;
}

//}



}else{

if(X<0){
if(Y>0){
// atan2=atn(Y/X)+pi;
valore=tan(Y/X)+pi;

}else{
// atan2=atn(Y/X)-pi;
valore=tan(Y/X)-pi;
}

// }
}else{
// atan2 = Atn(Y / X);
valore = tan(Y / X);
}




}

//spero in tuo aiuto...................... ciao amico mio W asm

cionci
04-06-2004, 18:50
Fammi capire....tu in pratica vuoi sapere se un dato punto si trova su un triangolo o sull'altro ?

okay
04-06-2004, 19:18
si...............

cionci
04-06-2004, 19:29
Allora è molto più facile...
Devi trovare se un segmento fra il vertice in alto a destra (seguendo l'esempio) ed il punto da verificare interseca i meno il segmento in comune dei due triangoli...

cionci
04-06-2004, 19:42
Anzi se è un quadrato allora è molto più semplice (mi confermi che sia un quadrato ?)...

//la funzione ritorna 0 per il tringolo 1 e 1 per il triangolo 2
inline int GetTringle(int x0, int y0)
{
//per evitare di assegnare tutti i pnti sulla diagonale ad un
//solo tringolo faccio questa cosa
if(x0 == y0)
return x0%2;
if(y0 > x0)
return 0; //trinagolo 1
return 1; //altrimenti tringolo 2
}

okay
04-06-2004, 21:30
si i due triangoli formano un quadrato...................

il proble è che che non capisco quali sono i vertici da passare
............ in effetti non sto a 2 dimensioni ma 3 dimensioni..............
guarda di nuovo il mio primo post

devo passare i vertici e per ogni triangolo sono 3 vertici costituiti dai punti:
v1.x v1.y v1.z
v2.x v2.y v2.z
v3.x v3.y v3.z

quali devo passare?????????

okay
05-06-2004, 00:26
okay...................
grazie cionci risolto!!!!!!!!!!!!