Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.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++ OpenGL gluUnProject对象拖动和摄影机问题_C++_Opengl - Fatal编程技术网

C++ OpenGL gluUnProject对象拖动和摄影机问题

C++ OpenGL gluUnProject对象拖动和摄影机问题,c++,opengl,C++,Opengl,我正在尝试使用鼠标移动对象: 我检索实际矩阵,并使用gluUnProject从鼠标位置dx和dy获取实际的x、y、z。在我不移动相机之前,一切正常。当相机从x轴开始以45225度旋转时,一切正常 但是当我接近x(+-)\z(+-)轴时,这就是行为(对象应该移动的平面没有正确更新) 我在鼠标点击事件中所做的事情: gluUnProject(event->x(), -event->y(), 0, model_matrix, proj_matrix, view_matrix, &

我正在尝试使用鼠标移动对象:

我检索实际矩阵,并使用gluUnProject从鼠标位置dx和dy获取实际的x、y、z。在我不移动相机之前,一切正常。当相机从x轴开始以45225度旋转时,一切正常

但是当我接近x(+-)\z(+-)轴时,这就是行为(对象应该移动的平面没有正确更新)

我在鼠标点击事件中所做的事情:

gluUnProject(event->x(), -event->y(), 0, model_matrix, proj_matrix, view_matrix, &newx, &newy, &newz);
    //dx and dy = mouse coords
    if (dy<dx){
        if (event->x()>mNewMousePosition.x()){
            emit SignalPreviewMouseChanged((float)(mNewx/1500)*acc,0,(float)(-mNewz/1500)*acc);
        }
        else {
            emit SignalPreviewMouseChanged((float)(-mNewx/1500)*acc,0,(float)(mNewz/1500)*acc);
        }
    }
    else{
        if (event->y()<mNewMousePosition.y())
            emit SignalPreviewMouseChanged(0,(float)(mNewy/750)*acc,0);
        else {
            emit SignalPreviewMouseChanged(0,(float)(-mNewy/750)*acc,0);
        }
    }
glunproject(事件->x(),-event->y(),0,模型矩阵,项目矩阵,视图矩阵,&newx,&newy,&newz);
//dx和dy=鼠标坐标
如果(dyx()>mNewMousePosition.x()){
发射信号预览鼠标更改((浮动)(mNewx/1500)*acc,0,(浮动)(-mNewz/1500)*acc);
}
否则{
发射信号预览鼠标更改((浮动)(-mNewx/1500)*acc,0,(浮动)(mNewz/1500)*acc);
}
}
否则{
如果(event->y()Pos().x,mObjCamera->Pos().y,mObjCamera->Pos().z,
0,mObjCamera->View().y,0,
mObjCamera->Up().x,mObjCamera->Up().y,mObjCamera->Up().z);
}否则{
gluLookAt(mObjCamera->Pos().x,mObjCamera->Pos().y,mObjCamera->Pos().z,
mObjCamera->View().x,mObjCamera->View().y,mObjCamera->View().z,
mObjCamera->Up().x,mObjCamera->Up().y,mObjCamera->Up().z);
}
glGetDoublev(GLU模型视图矩阵、模型矩阵);
glGetDoublev(GL_投影矩阵,proj_矩阵);
glGetIntegerv(GL_视口、视图_矩阵);

对于(int k=0;kOne thing)来说,当我看到这段代码时,我会立即想到,在设置转换之前,您正在检索modelview、投影和视口矩阵……从逻辑上讲,我希望在调用
gluLookAt(…)之后看到这些事情发生
,否则您将使用至少一帧旧的/或未初始化的值。很抱歉,在剪切和粘贴代码以简化操作时,我会执行此错误。矩阵在glulookAt之后设置(代码更新)。我注意到的是,当我移动相机时,观察矩阵值,投影矩阵会更新,而modelview矩阵只会在视野改变时更新。我将在1天内打开bounty
void PaintGL()
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glViewport (0, 0, mScreenWidth, mScreenHeight);

if (mRotateAroundYAxis){
    gluLookAt(mObjCamera->Pos().x,  mObjCamera->Pos().y,  mObjCamera->Pos().z,
              0, mObjCamera->View().y, 0,
              mObjCamera->Up().x,   mObjCamera->Up().y,   mObjCamera->Up().z);        
}else{
    gluLookAt(mObjCamera->Pos().x,  mObjCamera->Pos().y,  mObjCamera->Pos().z,
              mObjCamera->View().x, mObjCamera->View().y, mObjCamera->View().z,
              mObjCamera->Up().x,   mObjCamera->Up().y,   mObjCamera->Up().z);            
}

glGetDoublev(GL_MODELVIEW_MATRIX, model_matrix);
glGetDoublev(GL_PROJECTION_MATRIX, proj_matrix);
glGetIntegerv(GL_VIEWPORT, view_matrix);

for (int k=0;k<mIndexSize/2;k++) {
    glCallList(mIndexSize-k);
}

DrawGrid();
DrawAxis();
}