我一直在試圖讓我的鼠標座標轉換成OpenGL場景中的三維空間座標。現在,我的預測有點混亂(我認爲),並且當我在場景中移動時,似乎沒有充分考慮我的「相機」。爲了檢查這一點,我畫了一條線。座標轉換和投影問題
我調整大小功能:
void oglWidget::resizeGL(int width, int height)
{
if (height == 0) {
height = 1;
}
pMatrix.setToIdentity();
pMatrix.perspective(fov, (float) width/(float) height, -1, 1);
glViewport(0, 0, width, height);
}
我的渲染功能(paintGl())去如下:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
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");
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();
並創建我雷:
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]);
我覺得我使用衝突的系統或其他東西。
我應該使用不同的變量來管理我的相機嗎?我看到投影視圖,模型視圖等的討論,但我不明白我將如何使用它,並使用着色器程序。當談到OpenGL時,我仍然是新手。
所以澄清:我試圖將我的鼠標座標轉換成三維空間座標。到目前爲止,它似乎是半工作,它只是沒有考慮到相機旋轉。我確認我的問題與射線創建有關,或者與座標的未投影有關,與我的實際射線拾取邏輯無關。
只要你知道,在窗口空間的近平面是** ** 0.0和遠平面** ** 1.0。您正在使用'z'的錯誤座標。實際上,除非你有一點恰好在近剪裁平面上,否則它可能並不重要。 – 2015-02-10 00:43:40
哎呀,忘了改回來。在提交它之前,我一直在瘋狂地改變價值觀以解決問題,我會改變這一點。 – Yattabyte 2015-02-10 01:11:24
另外,我不認爲簡單否定窗口系統鼠標座標是正確的。你想從頂部到底部改變原點,所以它通常是'maxY - Y'。 – 2015-02-10 01:38:10