1

OpenGL で単純なカメラを使用してシーンをレンダリングしています。これはレンダリング ループです。

            while(hasFocus)
            {
                    UpdateFrame(GetElapsedTimeInSeconds());
                    RenderFrame();
                    SwapBuffers(g_hDC);
            }

私がやりたいのは、シーン内のオブジェクトを選択することですが、一部の変換が奇妙に動作します。シーンをレンダリングする前に、レイはカメラの視点からマウスの近くの平面までシーンを通過し、遠くの平面に到達しました。この光線を描画して、計算が正しく行われているかどうかを確認します。下のスナップショットでわかるように、光線は私のカメラの「目」からではなく、奇妙な位置から来ています。

ここに画像の説明を入力

私は自分のカメラクラスを持っています。これは私の初期化です:

     Camera myCam(0.0f,2.0f,0.0f);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     gluPerspective(60,(g_windowWidth)/ (g_windowHeight), CAMERA_ZNEAR, CAMERA_ZFAR);

およびその他の初期化。関数でRenderFrameは、ピッキングとレンダリングを行っています。

     glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glDisable(GL_LIGHTING);
    glViewport( 0,0,g_windowHeight, g_windowHeight);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    myCam.setView();   // just set the view matrix with GL_MODELVIEW
    myCam.rotateLoc(-0.5, 0,1,0);
    glColor3f(1.0,1.0,1.0);
    Vector3* pointss = GetRayPoints();  // retrieve the two point for my Ray
    setIntersectionPoints(pointss[0],pointss[1]);
    RenderFloor();
    DrawSpheres();  // inside this I test hit of the ray created by points and the spheres

これはGetRayPoints:

   POINT mymouse;                        
GetCursorPos(&mymouse);               
Vector3 pointsOnLine[2];
double mvmatrix[16];
double projmatrix[16];
int viewport[4];
double dX, dY, dZ, dClickY,zz; 
glGetIntegerv(GL_VIEWPORT, viewport);   
//glGetDoublev (GL_MODELVIEW_MATRIX, mvmatrix);
glGetDoublev (GL_PROJECTION_MATRIX, projmatrix);
dClickY = double (viewport[3] - mymouse.y); 
const GLfloat* mtrx = myCam.getViewMat();
mtrx = myCam.getViewMat();
gluUnProject ((double) mymouse.x, dClickY, 0.0,mtrx,projmatrix, viewport, &dX, &dY, &dZ);
pointsOnLine[0] = Vector3( (float) dX, (float) dY, (float) dZ );
gluUnProject ((double) mymouse.x, dClickY, 1.0,mtrx,projmatrix, viewport, &dX, &dY, &dZ);
pointsOnLine[1]  = Vector3( (float) dX, (float) dY, (float) dZ );
return pointsOnLine;

内部DrawSpheresでは、点と線の交点の数学によってヒットまたはミスをチェックしています。これはうまく機能し、実際には球を選択していますが、スナップショットで見たようにマウスの下のピクセルでは選択していません。問題は間違った変換であり、したがって Ray の位置です。洞察はありますか?このレイはカメラ座標にあるので、viewmatrix の逆数によってワールド空間に持ち込む必要がありますか?!

4

0 に答える 0