2012-01-26 46 views
1

我得到正確的畫面協調(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

我需要射線物體碰撞,它現在起作用了!

+1

你是什麼意思,規範化?通常指的是用一個標量來分割一個矢量,將其放入標準格式(通常是單位長度)。你的代碼看起來不錯,但我質疑你爲什麼要讀取後臺緩衝區和z緩衝區,當你可以直接與你的世界位置進行射線對象碰撞。 – 2012-01-26 23:49:17

+1

問題是我們不明白你要求什麼或你想要做什麼。例如,使用「正常化」等術語是非標準和混淆的。 – 2012-01-26 23:56:10

回答

0

將移動的屏幕空間中的二維矢量(例​​如(20,0)爲20像素右)投影到世界空間中,其深度與您移動的對象相同。

通過將對象位置通過視圖和投影矩陣投影到屏幕空間中,可以找到與對象相同的「相同深度」。

glm::vec3 addThisToYourObjectPosition = glm::unProject(glm::vec3(screenMove.x, screenMove.y, objectProjectedZ), viewMatrix, projectionMatrix, glm::vec4(0.0f, 0.0f, winWidth, winHeight));