整个问题我刚开始学习用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);} 这个是我以前写的程序中的一段代码,可能有点乱,不过领会精神吧,希望能帮到你:)
在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);}
这个是我以前写的程序中的一段代码,可能有点乱,不过领会精神吧,希望能帮到你:)
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
这样应该可以的(我没有实测过)
可见的内容在屏幕窗口的显示是由投影矩阵所控制的一般在创建投影矩阵的时候,往往会指定fov和窗口的纵横比例,fov和窗口的最大方向有关
那么窗口的大小的改变只会影响到物体显示的大小,物体和窗口的相对位置不应该发生变化的
除非窗口的变化是非等比拉伸的,比如:单方向的,横向拉伸
这个时候,窗口的内容也只是物体显示的大小的变化,以及一部分物体可见或者不可见的区别物体相对于窗口中心的位置和大小的比例是不会变化的!你要达到的效果是什么呢?
当窗口变化后,我期望上面的做法能做到立方体还是可以在CRect(100,100,200,200)的地方出现
这样无论窗口如何变化,物体显示的大小都不会变化
2 根据窗口大小的变化,来移动相机的位置,窗口变化多大,相机平移一半的距离
如果用透视投影达不到效果,因为相机一旦变化,物体的观察角度就会发生变化的