2012-01-26 16 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)); 

けどこのように私のPerspective投影をセットアップして、私はzFarとzNearを知っているので、上記のコードが必要かどうかわかりません: glm :: perspective(fovy、1.0f * winWidth/winHeight、zNear、zFar); (私たちはZ、X、YによってzNearとzFarを取得する必要があります - 私たちは近くと遠くunprojectする必要があります)

また、このようにZデプスバッファを検出:このような

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; 

(現在、私の世界COORDはどちらかすぎたり、あまりにも近くにあり、それが問題だ)

編集

iPhone OpenGL : Using gluUnProject (port) and detecting clicking on an object

:私はここで最初の質問に答えを見つけます

私はレイオブジェクトの衝突が必要で​​す、それは今動作します!

+1

正規化とはどういう意味ですか?通常、ベクトルをスカラーで割って標準形式(たいていは単位長)にすることを指します。あなたのコードは大丈夫だと思いますが、世界の位置と直接衝突するだけでバックバッファとzバッファを読んでいる理由は疑問です。 –

+1

問題は、あなたが何を求めているのか、何をしようとしているのか理解できないことです。 「正規化」のような用語の使用は、非標準で混乱します。 –

答えて

0

あなたが移動しているオブジェクトと同じ奥行きの世界空間に、移動のためのスクリーンスペースにある2Dベクトル(例えば、(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)); 
関連する問題