我在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 的倒数将它带入世界空间吗?!