Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
如何使用Qt';s QVector3D::unproject()函数?_Qt_Opengl_Qvector3d - Fatal编程技术网

如何使用Qt';s QVector3D::unproject()函数?

如何使用Qt';s QVector3D::unproject()函数?,qt,opengl,qvector3d,Qt,Opengl,Qvector3d,我正在用Qt和新的QOpenGLWidget类做一个opengl项目。 我只是想在单击鼠标时获取鼠标的opengl世界坐标。 我已经找到了很多方法来做这件事,但是有些方法已经过时了,而另一些则不起作用。然后我找到了QVector3D::unproject()函数,但没有得到正确的坐标。 到目前为止,这是我代码的一部分: QMatrix4x4 modelView; modelView.setToIdentity(); modelView.lookAt(m_camera.getPosition(),

我正在用Qt和新的QOpenGLWidget类做一个opengl项目。 我只是想在单击鼠标时获取鼠标的opengl世界坐标。 我已经找到了很多方法来做这件事,但是有些方法已经过时了,而另一些则不起作用。然后我找到了QVector3D::unproject()函数,但没有得到正确的坐标。 到目前为止,这是我代码的一部分:

QMatrix4x4 modelView;
modelView.setToIdentity();
modelView.lookAt(m_camera.getPosition(), m_camera.getTarget(), m_camera.getUp());

QMatrix4x4 projection;
projection.perspective(70.0, width() / height(), 0.1, 120.0);

GLint view[4];
glGetIntegerv(GL_VIEWPORT, &view[0]);

QVector3D worldPosition = QVector3D(event->pos().x(), event->pos().y(), 0).unproject(modelView, projection, QRect(view[0], view[1], view[2], view[3]));
qDebug() << worldPosition;
QMatrix4x4模型视图;
modelView.setToIdentity();
modelView.lookAt(m_-camera.getPosition(),m_-camera.getTarget(),m_-camera.getUp());
QMatrix4x4投影;
投影透视图(70.0,宽度()/高度(),0.1120.0);
闪烁视图[4];
glGetIntegerv(GL_视口和视图[0]);
QVector3D worldPosition=QVector3D(事件->位置().x(),事件->位置().y(),0)。取消项目(模型视图,投影,QRect(视图[0],视图[1],视图[2],视图[3]);

qDebug()不清楚modelview矩阵的实际外观,但我发现您不太可能使用ger(-0.5,-0.5,0.0)。是什么让你认为这应该是结果呢?我用坐标画了一个三角形:GLfloat顶点[]={0.0f,1.0f,0.0f,-0.5f,-0.5f,0.0f,0.5f,-0.5f,0.0f};我知道矩阵的位置,目标和向量,所以我知道三角形的哪个角是(-0.5,-0.5,0.0)。这些值是:m_位置=QVector3D(2.0,-4.0,5.0);m_target=QVector3D(0.0,0.0,0.0);m_up=QVector3D(0.0,1.0,0.0);我试着在各种可能的情况下改变它们,但这绝不是我所期望的,如果你的相机在(2,-4,5),看着(0,0,0),而你的近平面在你的相机前面是0.1个单位,在窗口空间位置(x,y,0)取消投影一个点-显然在近平面上-最终会在一个垂直于观察方向的平面上,在你的相机前面0.1个单位的距离,所以(1.96532,-3.93444,4.93216)听起来像是一个非常合理的结果。如果你想恢复原来的顶点坐标,你不能忽略z坐标。我知道,我已经考虑过了,我改变了我的z坐标,结果是:0.5,我有一个点在z=0。这是有意义的,因为近平面为0.1(为了便于测试,我将相机位置更改为(0,0,5))。然而,我得到了(-0.140625,0.133333,0)它应该在的位置(-0.5,-0.5,0.0)。我发现我需要的是投影z坐标来取消x和y的投影,但为了得到它,我需要未投影的x和y。。。这是一个无限循环:pIt不清楚您的modelview矩阵实际上是什么样子,但我发现您不太可能使用ger(-0.5,-0.5,0.0)。是什么让你认为这应该是结果呢?我用坐标画了一个三角形:GLfloat顶点[]={0.0f,1.0f,0.0f,-0.5f,-0.5f,0.0f,0.5f,-0.5f,0.0f};我知道矩阵的位置,目标和向量,所以我知道三角形的哪个角是(-0.5,-0.5,0.0)。这些值是:m_位置=QVector3D(2.0,-4.0,5.0);m_target=QVector3D(0.0,0.0,0.0);m_up=QVector3D(0.0,1.0,0.0);我试着在各种可能的情况下改变它们,但这绝不是我所期望的,如果你的相机在(2,-4,5),看着(0,0,0),而你的近平面在你的相机前面是0.1个单位,在窗口空间位置(x,y,0)取消投影一个点-显然在近平面上-最终会在一个垂直于观察方向的平面上,在你的相机前面0.1个单位的距离,所以(1.96532,-3.93444,4.93216)听起来像是一个非常合理的结果。如果你想恢复原来的顶点坐标,你不能忽略z坐标。我知道,我已经考虑过了,我改变了我的z坐标,结果是:0.5,我有一个点在z=0。这是有意义的,因为近平面为0.1(为了便于测试,我将相机位置更改为(0,0,5))。然而,我得到了(-0.140625,0.133333,0)它应该在的位置(-0.5,-0.5,0.0)。我发现我需要的是投影z坐标来取消x和y的投影,但为了得到它,我需要未投影的x和y。。。这是一个无限循环:p