gluLookAt设定了眼睛位置eye,观察点center,观察者方向up。
gluPerspective设定了沿y轴的视野范围fovy(视景体上下两平面的夹角),屏幕的水平/竖直比例aspect,近截面与眼睛距离zNear,远截面与眼睛距离zFar.
现有如下物体。
投影后的情况如下所示:
用鼠标在屏幕上选择点As(x,y),可以用下函数获得远投影面上点的世界坐标Ap(X,Y,Z)
gluPerspective设定了沿y轴的视野范围fovy(视景体上下两平面的夹角),屏幕的水平/竖直比例aspect,近截面与眼睛距离zNear,远截面与眼睛距离zFar.
现有如下物体。
投影后的情况如下所示:
用鼠标在屏幕上选择点As(x,y),可以用下函数获得远投影面上点的世界坐标Ap(X,Y,Z)
void GetOGLPos(int x, int y, double * posX, double * posY, double * posZ)
{
GLint viewport[4];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLint Viewport[4];
glGetIntegerv(GL_VIEWPORT, Viewport);
GLdouble ModelMatrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX, ModelMatrix);
GLdouble ProjMatrix[16];
glGetDoublev(GL_PROJECTION_MATRIX, ProjMatrix);
glGetDoublev( GL_MODELVIEW_MATRIX, ModelMatrix );
glGetDoublev( GL_PROJECTION_MATRIX, ProjMatrix );
glGetIntegerv( GL_VIEWPORT, Viewport );
winX = (GLdouble)x;
winY = (GLdouble)(Viewport[3] - (GLint)y-1);
//glReadPixels( winX,winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
// 第三个参数:1表示远裁剪面,0表示近裁剪面。
int nX = int(x);
int nY = int(Viewport[3] - (GLint)y-1);
// gluUnProject( nX, nY, 0, ModelMatrix, ProjMatrix, Viewport, posX, posY, posZ);
gluUnProject( nX, nY, 1, ModelMatrix, ProjMatrix, Viewport, posX, posY, posZ);
}
eye与Ap的直线与物体相交的点即为A点的世界坐标。
对于由点云构成的物体,可以用点与直线的距离来找出物体上与直线最近的点。