我试图从我的鼠标位置创建一条射线进入3D空间,显然为了做到这一点,我需要" UnProject()"它。
这样做会给我一个介于0和0之间的值。每个轴1个。
不能来绘制" Ray"或者来自视口的一条线,可以吗?所有这些,基本上是我的鼠标对视口大小的百分比。
如果这确实是对的,那么我就不了解以下内容:
如果这确实是错误的,那会导致这样的错误吗? 我尝试不投影我自己的对象的顶点,并且它们不受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;
}
答案 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中拉出矩阵,因为它们从未将它们存储在第一位。
问题解决了:
我仍然不知道为什么unprojecting对我不起作用,因为我在GLU以及GLM的unproject函数中得到了错误的结果,但是手动操作对我有效。
由于我的问题延长了很长一段时间,并且提出了几个问题,所以我非常感谢一些帮助我的人: