UnProjected鼠标坐标在0-1之间

时间:2015-02-11 20:37:40

标签: c++ opengl projection vertices glu

我试图从我的鼠标位置创建一条射线进入3D空间,显然为了做到这一点,我需要" UnProject()"它。

这样做会给我一个介于0和0之间的值。每个轴1个。

不能来绘制" Ray"或者来自视口的一条线,可以吗?所有这些,基本上是我的鼠标对视口大小的百分比。

如果这确实是对的,那么我就不了解以下内容:

  • 我绘制的顶点约束于0-1的三角形,而不是像(0,100,0),(100,100,0),(100,0,0)这样的坐标, 这些画得非常好
  • 但是,绘制从我的鼠标坐标中取消投影的顶点作为线条/点也可以画得非常精细
  • 如何将鼠标坐标与对象的坐标进行比较?

如果这确实是错误的,那会导致这样的错误吗? 我尝试不投影我自己的对象的顶点,并且它们不受0-1的约束。 我不知道我是否处理了我的预测"当渲染甚至与gluUnproject兼容时。我只是按照这里的教程显示的方式(靠近底部)进行操作:http://qt-project.org/wiki/Developer-Guides#28810c65dd0f273a567b83a48839d275

这是我尝试获取鼠标坐标的方式:

GLdouble modelViewMatrix[16];
GLdouble projectionMatrix[16];
GLint viewport[4];
GLfloat winX, winY, winZ;
glGetDoublev(GL_MODELVIEW_MATRIX, modelViewMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projectionMatrix);
glGetIntegerv(GL_VIEWPORT, viewport);

winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels( winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );

GLdouble nearPlaneLocation[3];
gluUnProject(winX, winY, 0, modelViewMatrix, projectionMatrix,
             viewport, &nearPlaneLocation[0], &nearPlaneLocation[1],
        &nearPlaneLocation[2]);

GLdouble farPlaneLocation[3];
gluUnProject(winX, winY, 1, modelViewMatrix, projectionMatrix,
             viewport, &farPlaneLocation[0], &farPlaneLocation[1],
        &farPlaneLocation[2]);

QVector3D nearP = QVector3D(nearPlaneLocation[0], nearPlaneLocation[1],
        nearPlaneLocation[2]);
QVector3D farP = QVector3D(farPlaneLocation[0], farPlaneLocation[1],
        farPlaneLocation[2]);

也许我的实际预测已经结束了?

void oglWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    QMatrix4x4 mMatrix;
    QMatrix4x4 vMatrix;

    QMatrix4x4 cameraTransformation;
    cameraTransformation.rotate(alpha, 0, 1, 0);
    cameraTransformation.rotate(beta, 1, 0, 0);

    QVector3D cameraPosition = cameraTransformation * QVector3D(camX, camY, distance);
    QVector3D cameraUpDirection = cameraTransformation * QVector3D(0, 1, 0);
    vMatrix.lookAt(cameraPosition, QVector3D(camX, camY, 0), cameraUpDirection);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(cameraPosition.x(), cameraPosition.y(), cameraPosition.z(), camX, camY, 0, cameraUpDirection.x(), cameraUpDirection.y(), cameraUpDirection.z());
    shaderProgram.bind();
    shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix);
    shaderProgram.setUniformValue("texture", 0);


    for (int x = 0; x < tileCount; x++)
    {
        shaderProgram.setAttributeArray("vertex", tiles[x]->vertices.constData());
        shaderProgram.enableAttributeArray("vertex");
        shaderProgram.setAttributeArray("textureCoordinate", textureCoordinates.constData());
        shaderProgram.enableAttributeArray("textureCoordinate");

        //Triangle Drawing
        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tiles[x]->image.width(), tiles[x]->image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tiles[x]->image.bits());
        glDrawArrays(GL_TRIANGLES, 0, tiles[x]->vertices.size());
    }    

    shaderProgram.release();

}

其中,pMatrix是一个4x4矩阵,在调整大小事件期间受到控制,如:

 pMatrix.setToIdentity();
 pMatrix.perspective(fov, (float) width / (float) height, 0.001, 10000);
 glViewport(0, 0, width, height);

我的顶点着色器设置如下:

uniform mat4 mvpMatrix;

in vec4 vertex;
in vec2 textureCoordinate;

out vec2 varyingTextureCoordinate;

void main(void)
{
    varyingTextureCoordinate = textureCoordinate;
    gl_Position = mvpMatrix * vertex;
}

2 个答案:

答案 0 :(得分:0)

glReadPixels采用整数(x和y),因为某些原因你似乎没有在gluUnProject中使用winZ。

试试这样:

gluUnProject(winX, winY, winZ, glView, glProjection, viewport, &posX, &posY, &posZ);

此外,如果您希望光线在深度缓冲区中遇到某些内容时停止,则渲染后不要清除深度缓冲区。如果你执行glClear(GL_DEPTH_BUFFER_BIT),则光线应该远离你在投影矩阵中设置的远剪辑。

我也不知道为什么你需要多次调用它。最后三个浮点数将是目标矢量,您可以使用相机位置作为光源(取决于您正在做的事情)。

答案 1 :(得分:0)

我的部分问题在于描述得很糟糕。我不小心将残留的代码留在了疯狂的测试中,导致了一些“读取Pixel”函数和相关的废话,这对于解决问题没有用。

我的问题的其余部分是由于矩阵的数据类型不一致,并试图从OpenGL中拉出矩阵,因为它们从未将它们存储在第一位。

问题解决了:

  • Using GLM to hold all my matrices
  • 自己进行计算(逆视图矩阵*逆模型矩阵*逆投影矩阵)*保持NDC转换屏幕空间坐标的矢量(范围-1到1:x或y除以宽度或高度,* 2 - 1) ,对于远或近平面也具有-1或1的az,以及1的aw。
  • 将结果除以向量的第四个点。

我仍然不知道为什么unprojecting对我不起作用,因为我在GLU以及GLM的unproject函数中得到了错误的结果,但是手动操作对我有效。

由于我的问题延长了很长一段时间,并且提出了几个问题,所以我非常感谢一些帮助我的人:

相关问题