小弟我最近遇到一个问题,用opengl和MFC画图,搭建好MFC下的opengl画图环境后,首先在3D空间画了一个平面:
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glLoadIdentity();
glTranslated(0.0,-1.0,-30.0);
glRotatef(x_angle, 1.0, 0.0, 0.0);   //x_angle可以设置为任何值;一开始不妨设为0;后面还要用到此变量。glColor3f(1.0, 0.0, 0.0); 
glBegin(GL_POLYGON);
glVertex3f(-10, -5, 15);
glVertex3f(10, -5, 15);
glVertex3f(10, -5, -15);
glVertex3f(0, -5, -25);
glVertex3f(-10, -5, -15);
glEnd();
以上代码是画平面,在ONDRAW()里调用,编译后即可看到红色的平铺的一个平面;
然后在菜单中增加一项:"用鼠标来画线"的菜单选项,响应函数如下:
void CMYView::Onstraight()
{
// TODO: 在此添加命令处理程序代码
m_straight=true;  //这个BOOL变量用来判断是不是点了这个菜单选项;
}接着在鼠标左键响应函数里添加:
void CtestView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(m_straight)
{

m_startpt=point;
glPushMatrix();
glTranslated(0.0,-1.0,-30.0);


glGetIntegerv(GL_VIEWPORT, viewport); // 得到的是最后一个设置视口的参数,viewport在头文件中定
                                                         //义,得到视区的X,Y,LEFT,BOTTOM;
glGetDoublev(GL_MODELVIEW_MATRIX, modelview); //得到投影矩阵
glGetDoublev(GL_PROJECTION_MATRIX, projection);//得到透视矩阵
glPopMatrix(); winX = point.x; //得到视区坐标
winY = viewport[3] - point.y;//视区坐标
                  //进行坐标转换,把wniX,winY,0.0(代表近裁减面)转化为3D空间坐标:posX,posY,posZ;
gluUnProject(winX, winY, 0.0, modelview, projection, viewport, &posX, &posY, &posZ);
GLdouble nearpt[3],farpt[3];
nearpt[0]=posX;
nearpt[1]=posY;
nearpt[2]=posZ;
                  //转化为远裁减面3D坐标
gluUnProject(winX, winY, 1.0, modelview, projection, viewport, &posX, &posY, &posZ);
farpt[0]=posX;
farpt[1]=posY;
farpt[2]=posZ;
//得到两个裁减面之间的距离(不知道这么说对不对),然后得到3个坐标resultpt[0,1,2];
                  //这3个坐标表示的是当鼠标移动时,得到的鼠标屏幕坐标在红色平面上的投影坐标,简单说就是鼠标  发射的射线和红色平面相交的交点的3d坐标;
GLdouble tmppt[3],resultpt[3];
tmppt[0]=farpt[0]-nearpt[0];
tmppt[1]=farpt[1]-nearpt[1];
tmppt[2]=farpt[2]-nearpt[2]; resultpt[0]=tmppt[0]*(-5-nearpt[1])/tmppt[1]+nearpt[0];
resultpt[1]=-5;
resultpt[2]=tmppt[2]*(-5-nearpt[1])/tmppt[1]+nearpt[2];
//---------------------------- } CScrollView::OnLButtonDown(nFlags, point);
}
然后就可以在onmosemove函数里用类似的方法得到即时的在红色平面的投影坐标值,并把这个坐标点画在红色平面上(具体方法略);现在我已经把这个投影点画出来,并且能让它随着鼠标移动而在红色平面上移动,但是,问题在于:
  假如我现在把x_angle设为90度,即让这个平铺的平面绕X轴转90度竖直的对着我们,鼠标移动到当前窗口的最上面时,对应的投影坐标点只能移动到红色平面的中间部分,不能再向上移动了,也就是说这个角度下,我不能将鼠标的投影坐标点移动到红色平面的上半部分,请问这是为什么?我需要怎么改进才能在这种角度下让投影坐标能移动到红色平面的上半部分?