1

y=-50平面にクワッドがあります。現時点では、クワッドをマウスでクリックしたときの座標を取得するだけです。私はこれを限られた範囲で行うことができました。問題は、クワッドを描画するときに適用した変換が考慮されていないことです。いくつかの定数を追加して機能させることもできますが、ユーザーがglRotatef()を使用してx軸とy軸を中心にシーンを回転できるようにすると、回転が発生するとすぐに座標が乱れます。

これが私が今していることです:

gluUnProject()を2回呼び出します。1回はz = 0で、もう1回はz=1です。

gluUnProject( mouseX, WINDOW_HEIGHT - mouseY, 0, modelView, projection, viewport, &x1, &y1, &z1);
gluUnProject( mouseX, WINDOW_HEIGHT - mouseY, 1, modelView, projection, viewport, &x2, &y2, &z2);

正規化された光線ベクトル:

x = x2 - x1;
y = y2 - y1;
z = z2 - z1;
mag = sqrt(x*x + y*y + z*z);
x /= mag;
y /= mag;
z /= mag;

パラメトリック方程式:

float t = -(camY) / y;
planeX = camX + t*x;
planeY = camY + t*y;
planeZ = camZ + t*z;

ここで、(camX、camY、camZ)は、gluLookAt()に渡されるカメラの位置です。

平面X、平面Y、平面Zを、四角形の描画に使用したのと同じ座標系で、四角形のクリックの座標にします。どうすればこれを達成できますか?

4

1 に答える 1

1

選択した明示的なz深度を渡すことは想定されていません。ワールド座標を見つけるには、その特定のマウス座標でデプスバッファ値を渡す必要があります。

GLfloat depth;
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);

それをgluUnProjectに渡すと、探している値が得られます。さらに、genpfaultがコメントで述べたように、適切なタイミングでモデルビューのマトリックスデータを取得していることを確認してください。そうしないと、マトリックスが間違っています。

于 2011-02-04T17:35:45.350 に答える