Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GlunProject不工作_C++_Opengl_Glu - Fatal编程技术网

C++ GlunProject不工作

C++ GlunProject不工作,c++,opengl,glu,C++,Opengl,Glu,我试图使用glUnProject将鼠标坐标转换为世界坐标,但它似乎不起作用,或者我只是误解了glUnProject函数的功能,这是我正在使用的代码,我的矩阵都很好,而鼠标x坐标上的-300,我用的是C++ Win32对话框,而ScRunCoLITENT给了我很坏的结果。 int appWidth = CApplication::GetInstance()->GetWidth(); int appHeight = CApplication::GetInsta

我试图使用glUnProject将鼠标坐标转换为世界坐标,但它似乎不起作用,或者我只是误解了glUnProject函数的功能,这是我正在使用的代码,我的矩阵都很好,而鼠标x坐标上的-300,我用的是C++ Win32对话框,而ScRunCoLITENT给了我很坏的结果。
        int appWidth  = CApplication::GetInstance()->GetWidth();
        int appHeight = CApplication::GetInstance()->GetHeight();
        float fAspect = (float)appWidth / (float)appHeight;

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60.0f, fAspect, 0.1f, 100000.0f);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(m_vecCamera.x, -m_vecCamera.y, m_vecCamera.z);

        GLint viewport[4];
        GLdouble modelview[16];
        GLdouble projection[16];
        GLfloat winX, winY, winZ;
        GLdouble posX, posY, posZ;

        glEnable(GL_DEPTH);
        //Retrieve the Model/View, Projection, and Viewport Matrices
        glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
        glGetDoublev( GL_PROJECTION_MATRIX, projection );
        glGetIntegerv( GL_VIEWPORT, viewport );

        //Retrieve the Mouse X and the flipped Mouse Y
        winX = (float)pInput->msg.param1-300.0f;
        winY = (float)viewport[3]-(float)pInput->msg.param2;
        glReadPixels( int(winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );

        gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
然而,这给了我相对于屏幕中心的坐标,我假设这是相对于我的相机的坐标,我也尝试实现我自己的功能

Vector2f MouseUnProject(int x, int y)
{

        GLint viewport[4];
        GLdouble modelview[16];
        GLdouble projection[16];
        GLfloat winX, winY, winZ;
        GLdouble posX, posY, posZ;

        glEnable(GL_DEPTH);
        //Retrieve the Model/View, Projection, and Viewport Matrices
        glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
        glGetDoublev( GL_PROJECTION_MATRIX, projection );
        glGetIntegerv( GL_VIEWPORT, viewport );

        //Retrieve the Mouse X and the flipped Mouse Y
        winX = (float)x;
        winY = (float)viewport[3]-y;
        glReadPixels( int(winX), int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );

        double projectionX, projectionY;
        double viewX, viewY;
        double worldX, worldY;

        //Convert from Screen Coords to Projection Coords
        projectionX = (double)winX / ((double)viewport[2]/2.0) - 1.0;
        projectionY = (double)winY / ((double)viewport[3]/2.0) + 1.0;

        //Convert from projection Coords to View Coords
        viewX = projectionX * modelview[14];
        viewY = projectionY * modelview[14];

        //Convert from View Coords to World Coords
        worldX = viewX + modelview[12];
        worldY = viewY - modelview[13];

        return Vector2f(worldX, worldY);

}
它在一定的支架上工作,但是当移动相机时,数字会立即变小,从投影到视图坐标的转换“似乎”是正常的,投影坐标绝对是好的


我真的更喜欢使用glUnProject,而不是我自己的函数,但我无法让它在我的生活中发挥作用,我发现的所有谷歌搜索似乎都不能回答我的问题。德国劳埃德船级社文档中“对象空间”的确切含义是什么?也许我对此的理解是错误的,如果是,我还需要做些什么才能在正确的空间中获得坐标?

是一年前发布的,但不管怎么说……因此,由于您调用了gluPerspective,所以您获得的是相对于屏幕的坐标。这个调用在内部调用glfrustum,它将生成范围{-1,1}内的规范化坐标。但是,如果直接使用“近/远”值调用glfrustum,则会从该范围内的gluUnproject获得结果

要返回地图编辑器坐标,只需从gluUnproject获取结果并手动将范围转换回编辑器坐标系,即{-1,1}=>{0,max}


要开始,您应该通过输入0,0,midX,midY,maxX,maxY来测试gluUnProject,gluUnProject的结果应该是-1,-1,depth,0,0,depth和1,1,depth。如果使用glFrustum设置投影矩阵,则上述结果将在近/远范围内返回

你需要有一些几何体来转换,例如,你的鼠标在什么地方?-当你的世界没有任何东西时,转换为世界坐标是没有意义的。你在画几何体,对吗?我想得到相机Z上的鼠标坐标,相对于世界单位矩阵,从-100开始,GLU文档对这个函数的作用非常模糊,我设置了投影矩阵,重置了模型/视图矩阵,并对其应用了相机平移,我有一个贴图纹理四边形,从0,0,0开始,并从那里向一个方向延伸。我的印象是,在应用视图变换之前,此函数基本上会给我鼠标的位置,我看不到的是什么,我如何正确使用此函数?鼠标坐标加上深度会给你透视分割后对象的位置,即。,屏幕坐标:在某个x、y位置和屏幕的某个深度处。gluUnProject所做的是将此位置转换回原始对象的位置。因此,如果您绘制一个三角形,并且三角形中的一个顶点位于像素124,89处,深度为0.647,那么gluUnProject将能够告诉您该顶点的坐标。我不确定你的问题是什么,但我也不确定你在问什么。简单地说,我有一个地图编辑器,我希望在3D空间中检索鼠标的坐标,我的地图从0,0开始延伸,比如说在X轴和Y轴上1000,我希望检索到的坐标在地图左上角显示0,0,1000,1000在右下角,不管相机的平移,这是当我的鼠标悬停在他们的上方。所以,它是如何工作的:你开始你的框架。你画地图。您可以在鼠标下采样深度。将鼠标位置和深度与modelview和投影矩阵的当前值一起传递给gluUnProject。结果应该是你想要的位置。我怀疑你的问题是你没有先渲染对象,所以你的深度值是错误的。您应该使用print语句检查鼠标悬停在对象上时是否会发生显著变化。