我得到正確的畫面協調(0,0在左下角):OpenGL的:正火世界協調
GLint realy;
realy = winHeight - (GLint) y - 1;
screen.x = (float)x;
screen.y = (float)realy;
然後我得到了世界的zNear和zFar:
worldNear = glm::unProject(glm::vec3(screen.x, screen.y, 0.0), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));
worldFar = glm::unProject(glm::vec3(screen.x, screen.y, 1.0), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));
,但我設置我的透視投影是這樣的,所以我知道zFar和zNear,我不確定上面的代碼是否有必要:
glm :: perspective(fovy,1.0f * winWidth/winHeight,zNear,zFar);
(我們需要用X,Y,Z得到zNear和zFar - 所以我們需要遠近unproject)也
,檢測Zdepth緩衝這樣的:
GLfloat depth;
glReadPixels(screen.x, screen.y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
和像素顏色像這樣:
GLubyte pixel[3];
glReadBuffer(GL_BACK);
glReadPixels(screen.x, screen.y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, (void *)pixel);
問題是在這裏:我可以拿到世界X,Y,Z,但我需要標準化的協調,這樣我就可以順利通過鼠標,如何移動對象?
glm::vec4 normalizePoint = ** ??? **
world.x = normalizePoint.x;
world.y = normalizePoint.y;
world.z = normalizePoint.z;
(目前我的世界座標是太遠或太近,這就是問題所在)
編輯:我找到的第一個問題在這裏的答案:
iPhone OpenGL : Using gluUnProject (port) and detecting clicking on an object
我需要射線物體碰撞,它現在起作用了!
你是什麼意思,規範化?通常指的是用一個標量來分割一個矢量,將其放入標準格式(通常是單位長度)。你的代碼看起來不錯,但我質疑你爲什麼要讀取後臺緩衝區和z緩衝區,當你可以直接與你的世界位置進行射線對象碰撞。 – 2012-01-26 23:49:17
問題是我們不明白你要求什麼或你想要做什麼。例如,使用「正常化」等術語是非標準和混淆的。 – 2012-01-26 23:56:10