私は修正され、画面の調整(左下に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
:私はここで最初の質問に答えを見つけます私はレイオブジェクトの衝突が必要です、それは今動作します!
正規化とはどういう意味ですか?通常、ベクトルをスカラーで割って標準形式(たいていは単位長)にすることを指します。あなたのコードは大丈夫だと思いますが、世界の位置と直接衝突するだけでバックバッファとzバッファを読んでいる理由は疑問です。 –
問題は、あなたが何を求めているのか、何をしようとしているのか理解できないことです。 「正規化」のような用語の使用は、非標準で混乱します。 –