本帖最后由 ggggggo 于 2009-10-30 12:18:49 编辑

解决方案 »

  1.   


      这个程序是我想绘制出来一个窗口,在这里边选择两个点,根据它们的坐标转换成直线方程。然后我的程序里要用这条直线方程作一些操作。void COpenGL::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    CMainFrame * pMF = (CMainFrame*)AfxGetMainWnd();
    m_point2d[m_pointNum] = ScreenToGL(point);
    pMF->m_cutpoints[m_pointNum] = m_point2d[m_pointNum];
    HWND hWnd = GetSafeHwnd();
    HDC hDC = ::GetDC(hWnd);
    wglMakeCurrent(hDC, hglrc);
    DrawColorBox();
    SwapBuffers(hDC); // 使用双缓存
    m_pointNum++;


    CWnd::OnLButtonDown(nFlags, point);
    }
      

  2.   

        在一个窗体上设置口是400*300大,CRect rect(0, 0, 400, 300); 创建一个Opengl绘图区;     然后用opengl绘制的网格是X(-75,75),Y(-80,80)这么大。(绘制坐标是自动选的窗口中心为原点吧?)
         此网格的四个顶点坐标(在opengl绘图坐标)分别是左上(-75,80)、左下(-75,-80)、右上(75,80)、右下(75,-80)。
         当鼠标点击风格左上角点时,OnLButtonDown()里的point应该是{x=125,y=70}(在窗体矩形区坐标)啊,可是绘制出来的网格不在这个位置上,不知道是什么原因。     我不知道怎么发图片上来。。不然可以给你看一下效果了
    .(0,0)                                              .(400,0)
                 A.(-75,80)---------------B.(75,80)      
                  |                        |
                  |                        |
                  |                        |
                  |           .(0,0)       |
                  |                        |
                  |                        |
                  |                        |
                 C.(-75,-80)--------------D.(75,-80)       
    .(0,300)                                              .(400,300)就是这个样子的,呵呵  按这个效果计算:
               鼠标点击A点时返回的 Point应该是 { [400-(75+75)]/2=150, [300-(80+80)]/2=70 }
      可是返回的point是{x=88,y=29}...
       个人觉得问题可能是出在这个语句上了:
             glOrtho(-100.0, 100.0, -100.0 / m_aspect, 100.0 / m_aspect, -100, 100); 
       我不知道二维图形里面要不要这么设定,是在别人那里Copy来的。。
      

  3.   

    你先不要绘制网格,在你的视图里面,先显示一个最基本的东西,比如一个立方体,看看你是否能显示,怀疑你的OPGENGL没有配置或者初始化好!
      

  4.   

    我搞定了,是OnSize()里的一个函数用错了,在这里和大家分享一下吧,哈哈。    设置或修改修剪空间的范围句法:void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);
    描述:这个函数描述了一个平行修剪空间。这种投影意味着离观察者较远的对象看上去不会变小(与透视投影相反)。在3D笛卡尔坐标中想象这个修剪空间,左边和右边是最小和最大的X值,上边和下边是最小和最大的Y值,近处和远处是最小和最大的Z值。
          正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。glOrtho就是一个正射投影函数。它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(right,top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。所有的near和far值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。以上我看得晕得乎的,似懂非懂glOrtho()是设置三维界面的。而我的程序里用的是二维的,所以才出现了些莫明其妙的错误。在二维界面中,设置或修改修剪空间的范围应该用gluOrtho2D();下面再对它进行一下说明: gluOrtho2D(-200,150,-150,150);参数分别代表(左下角x坐标,右上角x坐标,左下角y坐标,右上角y坐标)——坐标全相对于窗口左下角--原点),near和far默认为-1和1,此函数决定一个平行六面体,即View Volume!View Volume越大,里面的物体显得越小!如,一个点的坐标是(0,0,0)就是在平行六面体的中间,也就是在viewport的中间;又如一个点的坐标是(-200,-150,0),是在平行六面体的左下角,也就是在vieport的左下角。
    注:viewport是指视窗的大小,就好像我们的眼睛!viweport可以用下面函数指定:
    glViewport(左下角x坐标, 左下角y坐标, wigth, height); 默认是(0,0,窗口的宽度,窗口的高度)
    可以用gluOrtho函数来指定near和far,gluOrtho(Xmin,Xmax,Ymin,Ymax,near,far);呵呵,又学到了一点儿。。同喜同喜!给大家散分。