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
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