Ответ 1
ПОСТАНОВИЛИ
Здесь, как это сделать, шаг за шагом.
0) Получить координаты мыши в клиентской области
1) Получите матрицу проекции и матрицу просмотра, если не требуется матрица модели.
2) Умножение проекции * Просмотр
3) Обратные результаты умножения
4) Построить вектор 4, состоящий из
x= mouseposition.x
в диапазоне окна x - преобразовать значения между -1 и 1
y= mouseposition.y
пределах диапазона окна y - преобразовать значения между -1 и 1 - запомнить инвертировать mouseposition.y при необходимости
z= the depth value
(это можно получить с помощью glReadPixel) - вы можете вручную перейти от -1 к 1 (zNear, zFar)
w= 1.0
5) Умножьте вектор на инвертированную матрицу, созданную до
6) Разделите вектор результата по этому компоненту w после умножения матрицы (разделение перспективы)
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);