0

クワッドをマウスポインターに追従させようとしています。したがって、基本的には画面座標を世界座標に変換する必要があります。これに関する多くの投稿や、NeHe や他の場所からのチュートリアルを見てきましたが、どれも適切に機能しません。ほとんどの場合、何らかのスケーリングの問題が発生します。マウスをウィンドウの中心から遠ざけるほど、クワッドがマウスからオフセットされます。

私が現在試しているコードは http://www.3dbuzz.com/forum/threads/191296-OpenGL-gluUnProject-ScreenCoords-to-WorldCoords-problemからのものです が、その中の人であっても、まだそのスケーリングの問題がありますリンクは、コードが彼のために働いたと言います。

クワッドをマウスに追従させるにはどうすればよいですか?

コードは次のとおりです (レンダー フレーム関数から)。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-5.0f);

POINT mouse;
GetCursorPos(&mouse);
ScreenToClient(WindowHandle, &mouse);

GLdouble
    posX1,
    posY1,
    posZ1,
    posX2,
    posY2,
    posZ2,
    modelview[16],
    projection[16];
GLint
    viewport[4];

glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);

gluUnProject( mouse.x, viewport[1] + viewport[3] - mouse.y, 0, modelview, projection, viewport, &posX1, &posY1, &posZ1);
gluUnProject( mouse.x, viewport[1] + viewport[3] - mouse.y, 1, modelview, projection, viewport, &posX2, &posY2, &posZ2);

GLfloat t = (posZ1 - 0) / (posZ1 - posZ2);

GLfloat
    fX = posX1 + (posX2 - posX1) * t,
    fY = posY1 + (posY2 - posY1) * t;

OutputDebugFloat(fX);
OutputDebugString(", ");
OutputDebugFloat(fY);
OutputDebugString("\n");

glTranslatef(fX, fY, 0);
DrawTile(test.Tex()); // Draws the quad with the specified texture

SwapBuffers(hDC);
4

1 に答える 1

0

わかりました、私はそれを理解したように見えました。問題は、背景のクワッドがないことでした。(これをテストしている間に空白の画面を表示できるように削除しました。悪い考えです。)私が試したチュートリアルのほとんどは実際に機能しましたが、それが原因で壊れていました。

編集:「glReadPixels」によって FPS がかなり低下することがわかりました。FPS/60 フレームごとにクワッド位置のみを更新することで、これを修正しました。

于 2013-03-25T02:07:57.737 に答える