-1

gluUnProjectを呼び出しています(アプリはGLES20を使用しています)。私の一生の間、私は探している価値を得ることができません。

(-9、0、0)にオブジェクトがあるので、gluUnProjectの結果がどういうわけかこれと等しくなる必要があります。カメラは(0、20、4)にあり、近平面/遠平面の距離は(3、100)です。関数の実行時に現在の行列を印刷しようとしました(この場合、画面上でタッチされるピクセル位置は(160、345)であり、オブジェクトの位置に非常に近いです)。

win: (160,345,0.0)
model: (1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0)
viewport: (0, 0, 1280, 720)
proj: (0.5625, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.020202, -1.0, 0.0, 0.0, -2.020202, 0.0)

飛行機の近く:

obj: (-1.3333333, -0.041666687, -1.0, 1.0)
final: (-1.3333333, -0.041666687, -1.0)

遠い飛行機:

obj: (-1.3333333, -0.041666687, -1.0, 0.00999999)
final: (-133.33345, -4.1666727, -100.0001)

ここでZ値に対して計算されたものを使用する必要がありますか?0.864前後の値を指定すると、ほぼ正しいX値(-9)が得られますが、これは私にはあまり意味がありません。この値はどの計算でも見つかりません。私は何度も何度も数字で遊んできましたが、すべてを一緒に機能させることはできません。ここで何が欠けていますか?

4

2 に答える 2

0

gluUnProjectではそれを行うことはできません。

3番目のパラメーターは、画面スペース内の目的のポイントの深さです(つまり、0から1の間で、0は近平面にマッピングされ、1は遠平面にマッピングされます)。

この値がわからないため、この関数を使用することはできません。

ピッキングを実装しようとしている場合は、手動で光線を起動し、オブジェクトとの交差をテストする必要があります(または、衝突/物理エンジンを使用してそれを実行します)。

于 2012-09-03T11:59:58.537 に答える
0

これが私のプロジェクトではありません

glm::vec3 World::Unproject(glm::vec3 v){
  glm::mat4 pv = ProjectionMatrix * ViewMatrix;
  glm::mat4 inv = glm::inverse(pv);
  glm::vec4 v4(v, 1.f);
  glm::vec4 r4 = inv * v4;
  glm::vec3 r(r4.x / r4.w, r4.y / r4.w, r4.z / r4.w);
  return r;
}

v(x,y,1.0)

-1.0 < x,y < 1.0

Camera、Unproject(v)-光線を定義します光線までの距離を計算できます

于 2012-09-03T13:22:15.503 に答える