今天结束时是时候做一点数学了..
我需要投影窗口大小的 4 个点:
<0,0> <1024,768>
进入世界空间坐标,因此它将形成一个四边形形状,稍后将用于地形剔除 - 没有 GluUnproject
仅用于测试,我使用鼠标坐标 - 并尝试将它们投影到世界坐标上
最佳答案
已解决
以下是如何一步步准确完成此操作。
- 获取客户区域内的鼠标坐标
- 如果不需要模型矩阵,请获取投影矩阵和 View 矩阵。
- 多重投影 * 查看
- 对乘法结果求逆
构造一个由以下内容组成的向量4
x =
mouseposition.x
在窗口 x 范围内- 转换为 -1 到 1 之间的值
y =
mouseposition.y
在窗口 y 范围内- 转换为 -1 到 1 之间的值
- 如果需要,请记住反转 mouseposition.y
z =
深度值
(可以使用 glReadPixel 获得)- 您可以手动从 -1 到 1(zNear、zFar)
w =
1.0
将向量乘以之前创建的逆矩阵
将矩阵乘法后的结果向量除以它的 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);
关于math - OpenGL 数学 - 将屏幕空间投影到世界空间坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7692988/