RISOLTO
Ecco come fare esattamente, passo dopo passo.
0) Ottieni i tuoi coordinate del mouse all'interno dell'area client
1) Ottenere il vostro matrice e Vista matrice di proiezione, se non a matrice modello richiesto.
2) Moltiplicare proiezione * Vedi
3) Inverse i risultati delle moltiplicazioni
4) Costruire una vector4 costituito da
x = mouseposition.x
raggio di finestra x - trasformare a valori compresi tra -1 e 1
y = mouseposition.y
in un intervallo di finestre y - Trasforma in valori compresi tra -1 e 1 - ricordarsi di invertire la posizione.y se necessario
z =the depth value
(questo può essere ottenuto con glReadPixel) - si può andare manualmente da -1 a 1 (zNear, zFar)
w = 1.0
5) Moltiplicare il vettore per matrice inversa creato prima
6) Dividere il vettore risultato dalla sua componente w dopo la moltiplicazione della matrice (divisione prospettica)
POINT mousePos;
GetCursorPos(&mousePos);
ScreenToClient(this->GetWindowHWND(), &mousePos);
CMatrix4x4 matProjection = m_pCamera->getViewMatrix() * m_pCamera->getProjectionMatrix() ;
CMatrix4x4 matInverse = matProjection.inverse();
float in[4];
float winZ = 1.0;
in[0]=(2.0f*((float)(mousePos.x-0)/(this->GetResolution().x-0)))-1.0f,
in[1]=1.0f-(2.0f*((float)(mousePos.y-0)/(this->GetResolution().y-0)));
in[2]=2.0* winZ -1.0;
in[3]=1.0;
CVector4 vIn = CVector4(in[0],in[1],in[2],in[3]);
pos = vIn * matInverse;
pos.w = 1.0/pos.w;
pos.x *= pos.w;
pos.y *= pos.w;
pos.z *= pos.w;
sprintf(strTitle,"%f %f %f/%f,%f,%f ",m_pCamera->m_vPosition.x,m_pCamera->m_vPosition.y,m_pCamera->m_vPosition.z,pos.x,pos.y,pos.z);
SetWindowText(this->GetWindowHWND(),strTitle);
non è la dimensione della finestra irrilevante? la forma/aspetto sicuramente, ma quello che cerchi è la forma rettangolare conica specifica delle forme di visualizzazione della videocamera, giusto? – Breton
ho trovato qualcosa di interessante http://collagefactory.blogspot.com/2010/03/gluunproject-source-code.html – YAHOOOOO
Breton, la cosa che sto cercando è costruire un 'bounding box' dalla vista della telecamera che io usa in seguito per trovare quali celle del terreno sono "dentro" così posso renderle. Quindi ho bisogno di sapere dove sono in alto a sinistra, in alto a destra, in basso a sinistra e in basso a destra nello spazio del mondo 3d in modo da poter trovare più tardi le cellule del terreno che si trovano all'interno di questo intervallo. – PeeS