怎样保证窗口大小变化后,而画的立方体在窗口中屏幕坐标不变化。

解决方案 »

  1.   

    整个问题我刚开始学习用VC/MFC编程的时候也遇到过
    在OnSize事件中,最后加上一条通知窗体绘制的消息。
    如:
    void CDialog_3D::OnSize(UINT nType, int cx, int cy) 
    {
    CDialog::OnSize(nType, cx, cy);


    // TODO: Add your message handler code here
    wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC);

    // TODO: Add your message handler code here glViewport(0,0,cx,cy); // Reset The Current Viewport glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
    glLoadIdentity(); // Reset The Projection Matrix // Calculate The Aspect Ratio Of The Window if(cx<=cy)
    glOrtho(-scale_3D,scale_3D,-scale_3D*(GLfloat)cy/(GLfloat)cx,scale_3D*(GLfloat)cy/(GLfloat)cx,-800.0,800.0);
    else
    glOrtho(-scale_3D*(GLfloat)cx/(GLfloat)cy,scale_3D*(GLfloat)cx/(GLfloat)cy,-scale_3D,scale_3D,-800.0,800.0);
    glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
    glLoadIdentity(); // wglMakeCurrent(NULL,NULL);
    PostMessage(WM_PAINT);}
    这个是我以前写的程序中的一段代码,可能有点乱,不过领会精神吧,希望能帮到你:)
      

  2.   

    假设现在条件是:
    1.观察到的实物范围是:lold,told,rold,bold
    2.窗口大小是:cxold,cyold窗口大小改变后的大小:cxnew,cynew
    则前后变化的比率为:
       cxScale=(double)cxnew/cxold;
       cyScale=(double)cynew/cyold;则设置当前的观察范围为:lold*cxScale,told*cyScale,rold*cxScale,bold*cyScale
    这样应该可以的(我没有实测过)
      

  3.   

    奇怪的问题一般的三维程序的框架当中,哪些内容可见都是由相机在世界坐标系下的位置所控制
    可见的内容在屏幕窗口的显示是由投影矩阵所控制的一般在创建投影矩阵的时候,往往会指定fov和窗口的纵横比例,fov和窗口的最大方向有关
    那么窗口的大小的改变只会影响到物体显示的大小,物体和窗口的相对位置不应该发生变化的
    除非窗口的变化是非等比拉伸的,比如:单方向的,横向拉伸
    这个时候,窗口的内容也只是物体显示的大小的变化,以及一部分物体可见或者不可见的区别物体相对于窗口中心的位置和大小的比例是不会变化的!你要达到的效果是什么呢?
      

  4.   

    假设现在你看到的立方体在屏幕上的位置是CRect(100,100,200,200),
    当窗口变化后,我期望上面的做法能做到立方体还是可以在CRect(100,100,200,200)的地方出现
      

  5.   

    对,就像zcqzy(OK) 所说的!
      

  6.   

    那你最好用平行投影的方式来显示物体1 根据窗口的大小来调节glOrtho的裁剪边界大小,保持一样
    这样无论窗口如何变化,物体显示的大小都不会变化
    2 根据窗口大小的变化,来移动相机的位置,窗口变化多大,相机平移一半的距离
    如果用透视投影达不到效果,因为相机一旦变化,物体的观察角度就会发生变化的
      

  7.   

    将设定视口的函数glViewport(x,y,width,height);中xy设为(0,0),则视口的坐标原点与屏幕的坐标原点保持一致,这样就可实现“假设现在你看到的立方体在屏幕上的位置是CRect(100,100,200,200),当窗口变化后,立方体还是可以在CRect(100,100,200,200)的地方出现”